Merge branch 'master' into fix/schedule-record-prompt-clamp
This commit is contained in:
commit
90e8dfd17f
120 files changed
+461
-274
No files matched your search
@@ -18,8 +18,8 @@
|
||||
en: a6d7884e4359af3a
|
||||
zh: e72588705942000a
|
||||
/agent-note-the-approval-seam-one-shot-permission-decisions-over-a-waterfall-of-answerers/decision/design-detail/the-seam-mechanism-and-policy-split:
|
||||
en: 0aa6f3a90921d1ea
|
||||
zh: c4a734f84800dae8
|
||||
en: 53da7800d8744d9e
|
||||
zh: 316fef884853ca5d
|
||||
/agent-note-the-approval-seam-one-shot-permission-decisions-over-a-waterfall-of-answerers/decision/design-detail/ask-routing-in-dsh-tools:
|
||||
en: 1d4478059f608fd2
|
||||
zh: 4a1d12e4ccb766b5
|
||||
|
||||
@@ -55,7 +55,7 @@ After validation and a successful `approval/asked` append, the service resolves
|
||||
|
||||
Answerers are `approval/request` waterfall listeners. Zero listeners fall through to `unavailable`; a recognizing listener occupies the first-wins decision slot, while an unrecognized agent must delegate with `next()`. Listeners dispose with their fibers, so an unloaded channel fails closed. Because sibling registration order is not deterministic, a deployment composes one terminal answerer and reserves `prepend` for decide-or-delegate gates.
|
||||
|
||||
`ApprovalRequest` carries the asking `agent`, `toolName`, optional exact `callId`, human-readable `reason`, and optional `signal`. It uses the `ToolCallId` brand without importing `dsh-tools`, which depends on this seam. Channel adapters correlate any richer call state by `callId`; the approval request does not duplicate tool arguments.
|
||||
`ApprovalRequest` carries the asking `agent`, `toolName`, optional exact `callId`, human-readable `reason`, optional localized `displayReason`, and optional `signal`. It uses the `ToolCallId` brand without importing `dsh-tools`, which depends on this seam. Channel adapters correlate any richer call state by `callId`; the approval request does not duplicate tool arguments.
|
||||
|
||||
#### Ask routing in dsh-tools
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ tool/result "escalated" — this one call ran under the wider mode; the gra
|
||||
|
||||
应答者是 `approval/request` waterfall 监听器。零监听器会直接落到 `unavailable`;识别该 agent 的监听器占用先到先得的决策槽,而不识别的监听器必须调用 `next()` 委派。监听器会随其 fiber 一同 dispose(资源释放),因此卸载通道后,请求会在故障时默认被拒绝。由于兄弟插件的注册顺序不确定,部署应组合一个终端应答者,并保留 `prepend` 给「决策或委派」门禁。
|
||||
|
||||
`ApprovalRequest` 携带发起请求的 `agent`、`toolName`、可选的精确 `callId`、人类可读的 `reason` 和可选的 `signal`。它使用 `ToolCallId` brand 而不导入依赖本 seam 的 `dsh-tools`。通道适配器可按 `callId` 关联任何更丰富的调用状态;审批请求本身不重复携带工具参数。
|
||||
`ApprovalRequest` 携带发起请求的 `agent`、`toolName`、可选的精确 `callId`、人类可读的 `reason`、可选的本地化 `displayReason` 和可选的 `signal`。它使用 `ToolCallId` brand 而不导入依赖本 seam 的 `dsh-tools`。通道适配器可按 `callId` 关联任何更丰富的调用状态;审批请求本身不重复携带工具参数。
|
||||
|
||||
#### dsh-tools 中的 Ask 路由
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ This matrix shows which packages dispatch each harness-owned event and which pac
|
||||
| `api-session/removed` | `emit` | [`packages/api/session-controller/src/types.ts:597`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` |
|
||||
| `api-session/status` | `emit` | [`packages/api/session-controller/src/types.ts:604`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` |
|
||||
| `app-boot/config-reload` | `emit` | [`packages/boot/app-boot/src/index.ts:52`](../packages/boot/app-boot/src/index.ts) | [`app-boot`](../packages/boot/app-boot) (`emit`) | [`settings`](../packages/settings/settings) |
|
||||
| `approval/request` | `waterfall` | [`packages/interaction/user-approval/src/types.ts:85`](../packages/interaction/user-approval/src/types.ts) | [`user-approval`](../packages/interaction/user-approval) (`waterfall`) | [`acp`](../packages/acp/acp), `remotes` |
|
||||
| `approval/request` | `waterfall` | [`packages/interaction/user-approval/src/types.ts:87`](../packages/interaction/user-approval/src/types.ts) | [`user-approval`](../packages/interaction/user-approval) (`waterfall`) | [`acp`](../packages/acp/acp), `remotes` |
|
||||
| `authorization/settled` | `emit` | [`packages/credentials/authorization/src/index.ts:57`](../packages/credentials/authorization/src/index.ts) | [`authorization`](../packages/credentials/authorization) (`events.dispatch`) | [`authorization`](../packages/credentials/authorization) |
|
||||
| `commands/change` | `emit` | [`packages/interaction/commands/src/types.ts:89`](../packages/interaction/commands/src/types.ts) | [`commands`](../packages/interaction/commands) (`events.dispatch`) | `remotes` |
|
||||
| `compaction/summary-error` | `waterfall` | [`packages/compaction/compaction/src/index.ts:106`](../packages/compaction/compaction/src/index.ts) | [`compaction-basic`](../packages/compaction/compaction-basic) (`waterfall`) | [`compaction-image-offload`](../packages/compaction/compaction-image-offload) |
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
| `api-session/removed` | `emit` | [`packages/api/session-controller/src/types.ts:597`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` |
|
||||
| `api-session/status` | `emit` | [`packages/api/session-controller/src/types.ts:604`](../packages/api/session-controller/src/types.ts) | `session-controller` (`emit`) | `remotes` |
|
||||
| `app-boot/config-reload` | `emit` | [`packages/boot/app-boot/src/index.ts:52`](../packages/boot/app-boot/src/index.ts) | [`app-boot`](../packages/boot/app-boot) (`emit`) | [`settings`](../packages/settings/settings) |
|
||||
| `approval/request` | `waterfall` | [`packages/interaction/user-approval/src/types.ts:85`](../packages/interaction/user-approval/src/types.ts) | [`user-approval`](../packages/interaction/user-approval) (`waterfall`) | [`acp`](../packages/acp/acp), `remotes` |
|
||||
| `approval/request` | `waterfall` | [`packages/interaction/user-approval/src/types.ts:87`](../packages/interaction/user-approval/src/types.ts) | [`user-approval`](../packages/interaction/user-approval) (`waterfall`) | [`acp`](../packages/acp/acp), `remotes` |
|
||||
| `authorization/settled` | `emit` | [`packages/credentials/authorization/src/index.ts:57`](../packages/credentials/authorization/src/index.ts) | [`authorization`](../packages/credentials/authorization) (`events.dispatch`) | [`authorization`](../packages/credentials/authorization) |
|
||||
| `commands/change` | `emit` | [`packages/interaction/commands/src/types.ts:89`](../packages/interaction/commands/src/types.ts) | [`commands`](../packages/interaction/commands) (`events.dispatch`) | `remotes` |
|
||||
| `compaction/summary-error` | `waterfall` | [`packages/compaction/compaction/src/index.ts:106`](../packages/compaction/compaction/src/index.ts) | [`compaction-basic`](../packages/compaction/compaction-basic) (`waterfall`) | [`compaction-image-offload`](../packages/compaction/compaction-image-offload) |
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
en: 5e51c6e37c5e30c3
|
||||
zh: 84bad36357332539
|
||||
/user-approval/approval-request:
|
||||
en: dc3647525133ff2f
|
||||
zh: 8365b809a93ec81d
|
||||
en: 044ddfc382eb745c
|
||||
zh: c0010b23c94ab3af
|
||||
/user-approval/dispatch-and-audit:
|
||||
en: bd2c2cc1eaaaf2d6
|
||||
zh: 67bfbed1b7499ffb
|
||||
@@ -50,7 +50,7 @@ Both policies contribute their complete current meaning to the cache-safe runtim
|
||||
|
||||
## Approval request
|
||||
|
||||
`ApprovalRequest` identifies the agent and tool action closely enough to route and audit the question. It deliberately omits tool arguments: an answerer attaches the prompt to the already-streamed tool call through `callId` instead of rendering a second copy that could drift.
|
||||
`ApprovalRequest` identifies the agent and tool action closely enough to route and audit the question. It deliberately omits tool arguments: an answerer attaches the prompt to the already-streamed tool call through `callId` instead of rendering a second copy that could drift. Optional `displayReason` carries requester-owned locale strings to presentation; `reason` remains the audit text.
|
||||
|
||||
```ts type-equiv
|
||||
/**
|
||||
|
||||
@@ -50,7 +50,7 @@ type ApprovalPolicy = 'ask' | 'never'
|
||||
|
||||
## 审批请求
|
||||
|
||||
`ApprovalRequest` 以足够精确的方式标识 agent 和工具操作,以便路由和审计该问题。它有意省略工具参数:应答者通过 `callId` 将提示附加到已流式输出的工具调用上,而非渲染另一份可能漂移的副本。
|
||||
`ApprovalRequest` 以足够精确的方式标识 agent 和工具操作,以便路由和审计该问题。它有意省略工具参数:应答者通过 `callId` 将提示附加到已流式输出的工具调用上,而非渲染另一份可能漂移的副本。可选的 `displayReason` 向界面传递请求方提供的本地化字符串;`reason` 仍是审计文本。
|
||||
|
||||
```ts type-equiv
|
||||
/**
|
||||
|
||||
@@ -551,7 +551,7 @@ Execute a TypeScript program against the available tools. Takes two required arg
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -555,7 +555,7 @@ ask_user_question 会暂停工具调用,直到当前 UI 提供方返回人类
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
en: adf7112e0691b89e
|
||||
zh: 14eeddcff985119f
|
||||
/deepseek-ai-dsh-client-ui-approval/known-limitations-and-deferred-work:
|
||||
en: 158f435625e41ca9
|
||||
zh: 9d58169aaf6c7ed7
|
||||
en: ae644102ed52f7ee
|
||||
zh: e109de1d517a3a94
|
||||
/deepseek-ai-dsh-client-ui-approval/known-limitations-and-deferred-work/dev-note:
|
||||
en: 240c92ce5e544116
|
||||
zh: 5bfae598cc20a3af
|
||||
@@ -33,7 +33,7 @@ None; approval request and response rendering does not alter a model request.
|
||||
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- **The panel exposes transient decisions only** — it supports allow-once and reject; persistent permission policy remains owned by Host-side approval packages.
|
||||
- **The panel exposes transient decisions only** — it supports allow-once and reject; persistent permission policy remains owned by Host-side approval packages. Requester-supplied localized presentation copy follows the UI language without changing the audit reason or translating model-generated text.
|
||||
|
||||
|
||||
<a id="dev-note"></a>
|
||||
|
||||
@@ -33,7 +33,7 @@ kind: "package-reference"
|
||||
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- **面板只提供临时决定**——它支持仅本次允许和拒绝;持久权限策略仍由 Host 侧审批包拥有。
|
||||
- **面板只提供临时决定**——它支持仅本次允许和拒绝;持久权限策略仍由 Host 侧审批包拥有。请求方提供的本地化展示文案跟随界面语言,不改写审计原因,也不翻译模型生成的文本。
|
||||
|
||||
|
||||
<a id="dev-note"></a>
|
||||
|
||||
@@ -14,11 +14,13 @@ export function ApprovalPanel(props: ApprovalComposerProps) {
|
||||
const detail = approval.callId === undefined
|
||||
? null
|
||||
: props.renderSlot('conversation.approval.detail', { callId: approval.callId })
|
||||
return <ApprovalFlow key={approval.key} pending={approval} detail={detail} t={props.t} />
|
||||
const reason = approval.displayReason === undefined ? approval.reason : props.resolveReason(approval.displayReason)
|
||||
return <ApprovalFlow key={approval.key} pending={approval} reason={reason} detail={detail} t={props.t} />
|
||||
}
|
||||
|
||||
function ApprovalFlow({ pending, detail, t }: {
|
||||
function ApprovalFlow({ pending, reason, detail, t }: {
|
||||
pending: PendingApproval
|
||||
reason: string | undefined
|
||||
detail: ReactNode
|
||||
t: ApprovalComposerProps['t']
|
||||
}) {
|
||||
@@ -69,7 +71,7 @@ function ApprovalFlow({ pending, detail, t }: {
|
||||
role="group"
|
||||
aria-label={t('detail.aria')}
|
||||
>
|
||||
<div className={css.headline}>{pending.reason ?? t('escalation', { toolName: pending.toolName })}</div>
|
||||
<div className={css.headline}>{reason ?? t('escalation', { toolName: pending.toolName })}</div>
|
||||
{detail !== null && <div className={css.command}>{detail}</div>}
|
||||
</div>
|
||||
<div className={css.actionRow}>
|
||||
|
||||
@@ -56,6 +56,8 @@ export interface ApprovalPresentationRequest {
|
||||
readonly callId?: ToolCallId
|
||||
/** Human-readable reason supplied by the requester. */
|
||||
readonly reason?: string
|
||||
/** Localized presentation copy; the audit reason remains unchanged. */
|
||||
readonly displayReason?: { readonly en: string; readonly [locale: string]: string }
|
||||
/** Cancellation projected from the Host waterfall. */
|
||||
readonly signal?: AbortSignal
|
||||
}
|
||||
@@ -80,6 +82,8 @@ export class PendingApproval {
|
||||
readonly callId: ToolCallId | undefined
|
||||
/** Human-readable reason supplied by the asker. */
|
||||
readonly reason: string | undefined
|
||||
/** Localized presentation copy, when supplied by the asker. */
|
||||
readonly displayReason: ApprovalPresentationRequest['displayReason']
|
||||
/** Result returned by the Remote Event listener to the Host waterfall. */
|
||||
readonly result: Promise<ApprovalDecision>
|
||||
|
||||
@@ -101,6 +105,7 @@ export class PendingApproval {
|
||||
this.toolName = request.toolName
|
||||
this.callId = request.callId
|
||||
this.reason = request.reason
|
||||
this.displayReason = request.displayReason
|
||||
const completion = Promise.withResolvers<ApprovalDecision>()
|
||||
this.result = completion.promise
|
||||
this.#resolve = completion.resolve
|
||||
@@ -170,9 +175,20 @@ export class PendingApproval {
|
||||
}
|
||||
}
|
||||
|
||||
/** Locale lookup supplied by the approval registration. */
|
||||
export interface ApprovalInjected {
|
||||
/**
|
||||
* Resolve requester-owned copy in the current UI language.
|
||||
* @param reason - localized presentation text with an English fallback.
|
||||
* @returns text for the active UI language.
|
||||
*/
|
||||
resolveReason(reason: NonNullable<ApprovalPresentationRequest['displayReason']>): string
|
||||
}
|
||||
|
||||
/** Full props of the approval composer takeover. */
|
||||
export type ApprovalComposerProps =
|
||||
PropsRuntime<'conversation.composer'>
|
||||
& PropsRenderSlots<'conversation.approval.detail'>
|
||||
& { matched: PendingApproval }
|
||||
& PropsLocale<'approval'>
|
||||
& ApprovalInjected
|
||||
@@ -48,6 +48,7 @@ async function answerApproval(
|
||||
? {}
|
||||
: { callId: request.callId }),
|
||||
...(request.reason === undefined ? {} : { reason: request.reason }),
|
||||
...(request.displayReason === undefined ? {} : { displayReason: request.displayReason }),
|
||||
...(request.signal === undefined ? {} : { signal: request.signal }),
|
||||
})
|
||||
const completed = Promise.withResolvers<void>()
|
||||
@@ -93,6 +94,9 @@ export function apply(ctx: ClientContext): void {
|
||||
select: ({ pendingInteraction }: ComposerChainProps): PendingApproval | null =>
|
||||
pendingInteraction instanceof PendingApproval ? pendingInteraction : null,
|
||||
locale: NS,
|
||||
inject: () => ({
|
||||
resolveReason: (reason: NonNullable<PendingApproval['displayReason']>) => ctx.locale.resolveText(reason),
|
||||
}),
|
||||
children: {
|
||||
'conversation.approval.detail': { kind: 'single', scope: 'session' },
|
||||
},
|
||||
|
||||
@@ -6,7 +6,7 @@ import type { SessionId } from '@deepseek-ai/dsh-session/types'
|
||||
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest'
|
||||
import { ApprovalPanel } from '../src/client/ApprovalPanel.tsx'
|
||||
import type { ApprovalComposerProps } from '../src/client/contract/slots.ts'
|
||||
import type { ApprovalComposerProps, ApprovalInjected } from '../src/client/contract/slots.ts'
|
||||
import { PendingApproval } from '../src/client/contract/slots.ts'
|
||||
import { apply, inject } from '../src/client/index.ts'
|
||||
import { apply as nodeApply } from '../src/index.ts'
|
||||
@@ -17,6 +17,7 @@ type ApprovalListener = (
|
||||
toolName: string
|
||||
callId?: string
|
||||
reason?: string
|
||||
displayReason?: PendingApproval['displayReason']
|
||||
signal?: AbortSignal
|
||||
},
|
||||
next: () => Promise<'unavailable'>,
|
||||
@@ -35,6 +36,7 @@ interface PluginBench {
|
||||
registration(): {
|
||||
options: {
|
||||
select(props: { pendingInteraction: PendingApproval | undefined }): PendingApproval | null
|
||||
inject(): ApprovalInjected
|
||||
}
|
||||
component: unknown
|
||||
}
|
||||
@@ -46,6 +48,7 @@ async function setupPlugin(): Promise<PluginBench> {
|
||||
let registration: {
|
||||
options: {
|
||||
select(props: { pendingInteraction: PendingApproval | undefined }): PendingApproval | null
|
||||
inject(): ApprovalInjected
|
||||
}
|
||||
component: unknown
|
||||
} | undefined
|
||||
@@ -82,6 +85,7 @@ async function setupPlugin(): Promise<PluginBench> {
|
||||
ctx.provide('slots', { inject: injectSlot, register } as never)
|
||||
ctx.provide('locale', {
|
||||
register: vi.fn(() => disposeLocale),
|
||||
resolveText: (reason: NonNullable<PendingApproval['displayReason']>) => reason.en,
|
||||
} as never)
|
||||
|
||||
const fiber = ctx.plugin({ apply })
|
||||
@@ -219,12 +223,15 @@ describe('approval Remote Event consumer', () => {
|
||||
toolName: 'bash',
|
||||
callId: 'call-1',
|
||||
reason: 'needs access',
|
||||
displayReason: { en: 'Display reason', zh: '展示原因' },
|
||||
signal: controller.signal,
|
||||
}, next)
|
||||
const pending = bench.pending.getSnapshot()[0]!
|
||||
const { options, component } = bench.registration()
|
||||
|
||||
expect(component).toBe(ApprovalPanel)
|
||||
expect(pending.displayReason).toEqual({ en: 'Display reason', zh: '展示原因' })
|
||||
expect(options.inject().resolveReason(pending.displayReason!)).toBe('Display reason')
|
||||
expect(options.select({ pendingInteraction: undefined })).toBeNull()
|
||||
expect(options.select({ pendingInteraction: pending })).toBe(pending)
|
||||
expect(pending).toMatchObject({
|
||||
@@ -319,8 +326,9 @@ function panelProps(
|
||||
return {
|
||||
matched: pending,
|
||||
renderSlot,
|
||||
resolveReason: (reason: NonNullable<PendingApproval['displayReason']>) => reason.en,
|
||||
t: (key: string) => messages[key] ?? key,
|
||||
} as unknown as ApprovalComposerProps
|
||||
} as ApprovalComposerProps
|
||||
}
|
||||
|
||||
describe('ApprovalPanel', () => {
|
||||
@@ -362,6 +370,21 @@ describe('ApprovalPanel', () => {
|
||||
await expect(pending.result).resolves.toBe('allowed-once')
|
||||
})
|
||||
|
||||
it('keeps the audit reason intact and follows the UI language for presentation copy', () => {
|
||||
const pending = new PendingApproval(id('s1'), {
|
||||
toolName: 'bash',
|
||||
reason: 'audit reason',
|
||||
displayReason: { en: 'English explanation', zh: '中文说明' },
|
||||
})
|
||||
const props = panelProps(pending)
|
||||
const view = render(<ApprovalPanel {...props} />)
|
||||
expect(screen.getByText('English explanation')).toBeTruthy()
|
||||
expect(screen.queryByText('audit reason')).toBeNull()
|
||||
view.rerender(<ApprovalPanel {...props} resolveReason={reason => reason['zh']!} />)
|
||||
expect(screen.getByText('中文说明')).toBeTruthy()
|
||||
expect(pending.reason).toBe('audit reason')
|
||||
})
|
||||
|
||||
it.each([['Enter', 'allowed-once'], ['Escape', 'rejected']] as const)(
|
||||
'answers the focused container with %s through the pending request', async (key, outcome) => {
|
||||
const pending = new PendingApproval(id('s1'), { toolName: 'bash' })
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
en: 589397a35f82244e
|
||||
zh: 342fbceee2c173a2
|
||||
/deepseek-ai-dsh-client-ui-settings-models/use-this-package/extension-slots:
|
||||
en: 6979796f0332268f
|
||||
zh: 00896a005cc4f4e2
|
||||
en: 65e9d8822b67b6c2
|
||||
zh: 7e83be9defda28ee
|
||||
/deepseek-ai-dsh-client-ui-settings-models/understand-the-implementation:
|
||||
en: a87afbec5e339b36
|
||||
zh: 6348c81af7e650e1
|
||||
|
||||
@@ -61,7 +61,7 @@ After the versioned notice step completes, the DeepSeek step projects first-run
|
||||
|
||||
The section declares two seats for plugins distributed outside this repository, typed in [`src/client/slot-contract.ts`](src/client/slot-contract.ts) and exported from `./client`. `settings.models.provider-card` (keyed) renders inside every card that shows a directory row — a saved row's card, its first-run setup posture, and the add-provider draft — dispatched with `entryKey = settingsNs` and owner props carrying the row's `ConfigurableProviderView`, its configured state, and its confirmed api-key credential state, so one registration under an adapter family's namespace receives every card of that family, hand-declared routes included; the hand-declared draft card has no directory row yet and dispatches nothing until saved. `settings.models.footer` (list) renders after the rows and the add controls. A registrant activates through `ctx.slots.inject` with a type-only import of this package's `/client` entry; without registrants both seats render nothing.
|
||||
|
||||
The Models page includes **DeepSeek Account** (`deepseek-account`, **DeepSeek 账号** in Chinese). Its editor exposes the shared DeepSeek model catalog without API-key or base-URL inputs. The account row is hidden when its available model catalog is empty, including before sign-in and after sign-out; it returns when account models become available.
|
||||
The Models page includes **DeepSeek Account** (`deepseek-account`, **DeepSeek 账号** in Chinese). Its editor exposes the shared DeepSeek model catalog without API-key or base-URL inputs, and saves that catalog under the account route's own settings section (`llm-deepseek-account` by default), so an account edit never rewrites the `llm-deepseek` section the official route reads. The account row is hidden when its available model catalog is empty, including before sign-in and after sign-out; it returns when account models become available.
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ API 密钥输入框初始为空,并通过 `autocomplete="new-password"` 请求
|
||||
|
||||
本分区为仓库外分发的插件声明两个席位,类型定义在 [`src/client/slot-contract.ts`](src/client/slot-contract.ts) 并从 `./client` 导出。`settings.models.provider-card`(keyed)渲染在每张展示目录行的卡片内部——已保存行的卡片、其首次运行 setup 形态、以及「添加提供商」草稿卡——以 `entryKey = settingsNs` 分发,owner props 携带该行的 `ConfigurableProviderView`、其 configured 状态与已确认的 api-key 凭据状态,因此以某适配器家族的 namespace 注册一次即可收到该家族的全部卡片,含手工声明的路由;手工声明的草稿卡尚无目录行,保存之前不分发。`settings.models.footer`(list)渲染在行列表与新增控件之后。注册方通过 `ctx.slots.inject` 激活,并以 type-only import 引入本包 `/client` 入口;没有注册方时两个席位均不渲染任何内容。
|
||||
|
||||
Models 页面包含 **DeepSeek 账号**(`deepseek-account`,英文为 **DeepSeek Account**)。其编辑器展示共享的 DeepSeek 模型目录,不提供 API Key 或 Base URL 输入框。账号可用模型目录为空时隐藏账号行,包括登录前和退登后;账号模型恢复可用时重新显示。
|
||||
Models 页面包含 **DeepSeek 账号**(`deepseek-account`,英文为 **DeepSeek Account**)。其编辑器展示共享的 DeepSeek 模型目录,不提供 API Key 或 Base URL 输入框;目录保存到账号路由自己的设置段(默认为 `llm-deepseek-account`),因此账号侧的编辑不会改写 official 路由读取的 `llm-deepseek` 段。账号可用模型目录为空时隐藏账号行,包括登录前和退登后;账号模型恢复可用时重新显示。
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -182,8 +182,9 @@ export function ProviderEditor(props: ProviderEditorProps): ReactNode {
|
||||
const node = useMemo(() => schema.nodeAtPath(root, settingsPath), [root, schema, settingsPath])
|
||||
const fallback = schema.getPath(namespace.value, settingsPath)
|
||||
const disabled = props.readOnly || busy
|
||||
const layout = layoutOf(namespace.ns)
|
||||
const accountProvider = props.provider === 'deepseek-account'
|
||||
// Account settings use a configurable Cordis entry id.
|
||||
const layout = accountProvider ? 'deepseek' : layoutOf(namespace.ns)
|
||||
const keyRef = refFor(schema, namespace, settingsPath, props.provider)
|
||||
// The same schema read the create card makes, so the choices offered here
|
||||
// and there cannot drift apart: both come from the adapter's own `Config`.
|
||||
|
||||
@@ -137,9 +137,29 @@ function wireNamespaces(): SettingsNamespaceView[] {
|
||||
secrets: [],
|
||||
revision: 4,
|
||||
},
|
||||
{
|
||||
ns: 'llm-deepseek-account',
|
||||
schema: JSON.parse(JSON.stringify(DeepSeekConfig.toJSON())) as JsonValue,
|
||||
value: {
|
||||
baseURL: 'https://base',
|
||||
defaultContextWindow: 1_000_000,
|
||||
maxTokens: 256_000,
|
||||
models: DEFAULT_DEEPSEEK_MODELS,
|
||||
},
|
||||
base: { defaultContextWindow: 1_000_000, maxTokens: 256_000, models: DEFAULT_DEEPSEEK_MODELS },
|
||||
user: {},
|
||||
autoGenerate: true, applies: 'live',
|
||||
secrets: [],
|
||||
revision: 0,
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
/** The account provider's settings namespace, under a composition's entry id. */
|
||||
function accountNamespace(ns = 'llm-deepseek-account'): SettingsNamespaceView {
|
||||
return { ...wireNamespaces().find(view => view.ns === 'llm-deepseek-account')!, ns }
|
||||
}
|
||||
|
||||
/** Credentials answers over the Remote carrier, which has no envelope. */
|
||||
function remoteOk<T>(value: T) {
|
||||
return { ok: true as const, value }
|
||||
@@ -1884,18 +1904,103 @@ describe('apiKeyFailure', () => {
|
||||
})
|
||||
|
||||
it.each([en, zh])('edits the account model catalog without credential or endpoint fields', async (copy) => {
|
||||
const scripted = scriptedFace({})
|
||||
const mutate = vi.fn(() => Promise.resolve(remoteOk(accountNamespace())))
|
||||
const scripted = scriptedFace({ mutate })
|
||||
const ops = operationsWith(scripted.face)
|
||||
const describe = vi.spyOn(ops, 'describeCredential')
|
||||
const namespace = accountNamespace()
|
||||
const onClose = vi.fn()
|
||||
render(<ProviderEditor provider="deepseek-account" displayName={copy.deepSeekAccount}
|
||||
namespace={wireNamespaces()[0]!} settingsPath={[]} schema={settingsSchema}
|
||||
operations={ops} t={key => copy[key]} readOnly={false} onClose={() => {}} />)
|
||||
namespace={namespace} settingsPath={[]} schema={settingsSchema}
|
||||
operations={ops} t={key => copy[key]} readOnly={false} onClose={onClose} />)
|
||||
expect(screen.queryByLabelText(copy.keyInput)).toBeNull()
|
||||
expect(screen.queryByLabelText(copy.baseUrl)).toBeNull()
|
||||
expect(describe).not.toHaveBeenCalled()
|
||||
expect(screen.getByDisplayValue('deepseek-v4-flash')).toBeTruthy()
|
||||
expect(screen.queryByText(content => content.includes(copy.advancedHint))).toBeNull()
|
||||
await expect(`${document.body.textContent}\n`)
|
||||
.toMatchFileSnapshot(`./expected/deepseek-account-${copy === en ? 'en' : 'zh'}.txt`)
|
||||
const set = vi.spyOn(ops, 'storeCredential')
|
||||
fireEvent.change(screen.getAllByLabelText(new RegExp(copy.modelId))[0]!, { target: { value: 'deepseek-v4-mini' } })
|
||||
fireEvent.click(screen.getByText(copy.apply))
|
||||
await waitFor(() => { expect(onClose).toHaveBeenCalledWith(true) })
|
||||
expect(mutate.mock.calls[0]).toEqual([
|
||||
'llm-deepseek-account',
|
||||
[{
|
||||
op: 'set',
|
||||
path: ['models'],
|
||||
value: [
|
||||
{
|
||||
id: 'deepseek-v4-mini',
|
||||
name: 'DeepSeek-V4-Flash',
|
||||
description: 'Preserved hidden detail',
|
||||
contextWindow: 1_000_000,
|
||||
},
|
||||
{ id: 'deepseek-v4-pro', name: 'DeepSeek-V4-Pro', contextWindow: 1_000_000 },
|
||||
],
|
||||
}],
|
||||
0,
|
||||
])
|
||||
expect(set).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('keeps the DeepSeek editor for an account route under a renamed settings entry', async () => {
|
||||
const namespace = accountNamespace('team-account-entry')
|
||||
const mutate = vi.fn(() => Promise.resolve(remoteOk(namespace)))
|
||||
const ops = operationsWith(scriptedFace({ mutate }).face)
|
||||
const set = vi.spyOn(ops, 'storeCredential')
|
||||
const onClose = vi.fn()
|
||||
render(<ProviderEditor provider="deepseek-account" displayName={en.deepSeekAccount}
|
||||
namespace={namespace} settingsPath={[]} schema={settingsSchema}
|
||||
operations={ops} t={t} readOnly={false} onClose={onClose} />)
|
||||
expect(screen.queryByText(content => content.includes(en.advancedHint))).toBeNull()
|
||||
expect(screen.getByDisplayValue('deepseek-v4-flash')).toBeTruthy()
|
||||
fireEvent.change(screen.getAllByLabelText(new RegExp(en.modelId))[0]!, { target: { value: 'deepseek-v4-mini' } })
|
||||
fireEvent.click(screen.getByText(en.apply))
|
||||
await waitFor(() => { expect(onClose).toHaveBeenCalledWith(true) })
|
||||
expect(mutate).toHaveBeenCalledWith('team-account-entry', expect.any(Array), 0)
|
||||
expect(set).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('opens the account row from the section and saves to its own namespace', async () => {
|
||||
const namespace = accountNamespace()
|
||||
const mutate = vi.fn(() => Promise.resolve(remoteOk(namespace)))
|
||||
const { controller, set } = await mountSection({ mutate })
|
||||
const row = controller.store.getSnapshot().rows[0]!
|
||||
await act(async () => { controller.store.update((state) => {
|
||||
state.rows = [{
|
||||
...row,
|
||||
accountAvailable: true,
|
||||
entry: {
|
||||
provider: 'deepseek-account', displayName: en.deepSeekAccount, settingsNs: namespace.ns, settingsPath: [], active: true,
|
||||
},
|
||||
}, ...state.rows]
|
||||
}) })
|
||||
fireEvent.click(screen.getByRole('button', {
|
||||
name: providerCopy(en.editProvider, { provider: 'deepseek-account', displayName: en.deepSeekAccount }),
|
||||
}))
|
||||
expect(screen.getByDisplayValue('deepseek-v4-flash')).toBeTruthy()
|
||||
fireEvent.change(screen.getAllByLabelText(new RegExp(en.modelId))[0]!, { target: { value: 'deepseek-v4-mini' } })
|
||||
fireEvent.click(screen.getByText(en.apply))
|
||||
await waitFor(() => { expect(mutate).toHaveBeenCalledTimes(1) })
|
||||
expect(mutate.mock.calls[0]).toEqual([
|
||||
'llm-deepseek-account',
|
||||
[{
|
||||
op: 'set',
|
||||
path: ['models'],
|
||||
value: [
|
||||
{
|
||||
id: 'deepseek-v4-mini',
|
||||
name: 'DeepSeek-V4-Flash',
|
||||
description: 'Preserved hidden detail',
|
||||
contextWindow: 1_000_000,
|
||||
},
|
||||
{ id: 'deepseek-v4-pro', name: 'DeepSeek-V4-Pro', contextWindow: 1_000_000 },
|
||||
],
|
||||
}],
|
||||
0,
|
||||
])
|
||||
expect(set).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('renders the localized account row and supports catalogs without capacity defaults', async () => {
|
||||
@@ -1907,7 +2012,7 @@ it('renders the localized account row and supports catalogs without capacity def
|
||||
}) })
|
||||
expect(screen.getByText(en.deepSeekAccount)).toBeTruthy()
|
||||
view.unmount()
|
||||
const namespace = wireNamespaces()[0]!
|
||||
const namespace = accountNamespace()
|
||||
render(<ProviderEditor provider="deepseek-account" displayName={en.deepSeekAccount}
|
||||
namespace={{ ...namespace, value: { models: [] }, base: { models: [] } }} settingsPath={[]} schema={settingsSchema}
|
||||
operations={operationsWith(scripted.face)} t={t} readOnly={false} onClose={() => {}} />)
|
||||
|
||||
@@ -62,6 +62,15 @@ const NAMESPACES = [
|
||||
secrets: [],
|
||||
revision: 0,
|
||||
},
|
||||
{
|
||||
ns: 'llm-deepseek-account',
|
||||
schema: {},
|
||||
value: { baseURL: 'https://base' },
|
||||
base: { baseURL: 'https://base' },
|
||||
autoGenerate: true, applies: 'live' as const,
|
||||
secrets: [],
|
||||
revision: 0,
|
||||
},
|
||||
{
|
||||
ns: 'llm-pi-ai',
|
||||
schema: {},
|
||||
@@ -346,7 +355,7 @@ describe('edge joins', () => {
|
||||
|
||||
it.each([false, true])('uses account availability without asking for an API key: %s', async (accountAvailable) => {
|
||||
const { ctx, mirror, seenRefs } = api({ accountAvailable, providers: async () => ok({ providers: [{
|
||||
provider: 'deepseek-account', displayName: 'DeepSeek Account', settingsNs: 'llm-deepseek', settingsPath: [], active: true,
|
||||
provider: 'deepseek-account', displayName: 'DeepSeek Account', settingsNs: 'llm-deepseek-account', settingsPath: [], active: true,
|
||||
}] }) })
|
||||
const store = new ModelsSettingsStore(ctx, settingsSchema, mirror)
|
||||
await store.load()
|
||||
@@ -356,12 +365,13 @@ it.each([false, true])('uses account availability without asking for an API key:
|
||||
expect(rows[0]).toMatchObject({ accountAvailable: true, apiKeyEnv: undefined, credential: undefined })
|
||||
expect(providerUsable(rows[0]!)).toBe(true)
|
||||
}
|
||||
expect(store.store.getSnapshot().namespaces.get('llm-deepseek-account')?.ns).toBe('llm-deepseek-account')
|
||||
expect(seenRefs).toEqual([])
|
||||
})
|
||||
|
||||
it('removes the account row after sign-out and restores it after sign-in', async () => {
|
||||
const overrides = { accountAvailable: true, providers: async () => ok({ providers: [{
|
||||
provider: 'deepseek-account', displayName: 'DeepSeek Account', settingsNs: 'llm-deepseek', settingsPath: [], active: true,
|
||||
provider: 'deepseek-account', displayName: 'DeepSeek Account', settingsNs: 'llm-deepseek-account', settingsPath: [], active: true,
|
||||
}, ...DIRECTORY] }) }
|
||||
const { ctx, mirror } = api(overrides)
|
||||
const store = new ModelsSettingsStore(ctx, settingsSchema, mirror)
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
en: dc44a88997777988
|
||||
zh: 56454aeace1c8b77
|
||||
/deepseek-ai-dsh-tools/understand-the-implementation/ptc-mode:
|
||||
en: b75b027e45340107
|
||||
zh: beffa345cf76df51
|
||||
en: 9e67cfffae432d15
|
||||
zh: 3a061b8e805c07cd
|
||||
/deepseek-ai-dsh-tools/understand-the-implementation/extension-points:
|
||||
en: c2a14d6f22bc9428
|
||||
zh: 89c1414fca465931
|
||||
|
||||
@@ -130,7 +130,7 @@ New sub-calls use `<parent>:ptc:<n>` ids. Consumers treat these ids as opaque an
|
||||
|
||||
Successful image-bearing subcall results become deferred user-message context with `source.kind` set to `ptc-mode`. Other additional contexts retain their producing tool's attribution.
|
||||
|
||||
`run_code` accepts `timeoutMs` when the mounted runtime supports an override; its schema reports the configured default and maximum, the runtime's usage instructions and the Session working directory. The Node default is 120,000 ms with a 600,000 ms cap, including nested tool and approval waits. A wider `sandbox_permissions` mode requires a non-empty `justification` and approval before the program starts. The grant applies to that complete execution; standing Session policy and nested tools retain their own authority. Programs are never replayed automatically: inspect earlier effects before explicitly retrying a denied program.
|
||||
`run_code` accepts `timeoutMs` when the mounted runtime supports an override; its schema reports the configured default and maximum, the runtime's usage instructions and the Session working directory. The Node default is 120,000 ms with a 600,000 ms cap, including nested tool and approval waits. A wider `sandbox_permissions` mode requires a non-empty `justification` and approval before the program starts. The schema asks the model to write that reason in the current user's language. The grant applies to that complete execution; standing Session policy and nested tools retain their own authority. Programs are never replayed automatically: inspect earlier effects before explicitly retrying a denied program.
|
||||
|
||||
<a id="extension-points"></a>
|
||||
### Extension points
|
||||
|
||||
@@ -130,7 +130,7 @@ ctx.tools.register(defineTool({
|
||||
|
||||
成功且包含图片的子调用结果会成为延后的 user-message 上下文,其 `source.kind` 为 `ptc-mode`。其他 additional context 保留其生产工具的归属。
|
||||
|
||||
当已挂载运行时支持覆盖时,`run_code` 接受 `timeoutMs`;其 schema 报告配置的默认值和上限、运行时使用说明及 Session 工作目录。Node 默认值为 120,000 ms,上限为 600,000 ms,包含嵌套工具和审批等待。更宽的 `sandbox_permissions` 模式要求非空 `justification`,并在程序启动前获得审批。授权仅用于该次完整执行;常驻 Session 策略与嵌套工具保留各自权限。程序不会自动重放:显式重试被拒程序前,应检查先前已发生的效果。
|
||||
当已挂载运行时支持覆盖时,`run_code` 接受 `timeoutMs`;其 schema 报告配置的默认值和上限、运行时使用说明及 Session 工作目录。Node 默认值为 120,000 ms,上限为 600,000 ms,包含嵌套工具和审批等待。更宽的 `sandbox_permissions` 模式要求非空 `justification`,并在程序启动前获得审批。schema 提示模型使用当前用户的语言撰写理由。授权仅用于该次完整执行;常驻 Session 策略与嵌套工具保留各自权限。程序不会自动重放:显式重试被拒程序前,应检查先前已发生的效果。
|
||||
|
||||
<a id="extension-points"></a>
|
||||
### 扩展点
|
||||
|
||||
@@ -108,7 +108,7 @@ const RUN_CODE_DESCRIPTION_PARAM_DESCRIPTION
|
||||
const RUN_CODE_CONTROLS = {
|
||||
timeoutMs: { type: 'number', description: 'Positive elapsed-time budget in milliseconds, capped by the deployment maximum.' },
|
||||
sandbox_permissions: { type: 'string', enum: [...ESCALATION_TARGETS], description: 'Wider sandbox mode for this complete program execution; requires justification and approval.' },
|
||||
justification: { type: 'string', description: 'Reason this complete program needs wider access, shown to the user for approval.' },
|
||||
justification: { type: 'string', description: 'Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request.' },
|
||||
} as const
|
||||
|
||||
function controlParameters(runtime: PtcRuntime | undefined) {
|
||||
|
||||
@@ -4467,7 +4467,7 @@ export const TYPE_API: readonly TypeApiEntry[] = [
|
||||
},
|
||||
{
|
||||
name: 'ApprovalRequestEvent',
|
||||
declaration: 'export interface ApprovalRequestEvent {\n readonly agent: Agent;\n readonly toolName: string;\n readonly callId?: ToolCallId;\n readonly reason?: string;\n readonly signal?: AbortSignal;\n}',
|
||||
declaration: 'export interface ApprovalRequestEvent {\n readonly agent: Agent;\n readonly toolName: string;\n readonly callId?: ToolCallId;\n readonly reason?: string;\n readonly displayReason?: {\n readonly en: string;\n readonly [locale: string]: string;\n };\n readonly signal?: AbortSignal;\n}',
|
||||
},
|
||||
{
|
||||
name: 'ArchiveSessionOptions',
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
en: 7eb705e3b132fcba
|
||||
zh: 883207b13d381f9e
|
||||
/deepseek-ai-dsh-tool-fs/use-this-package/policy-and-sandbox-behavior:
|
||||
en: 245b4be79ea4cc6b
|
||||
zh: ff15b41e778fadab
|
||||
en: 53d4ac2db089ef39
|
||||
zh: 214ea051ed56f500
|
||||
/deepseek-ai-dsh-tool-fs/use-this-package/failures-and-recovery:
|
||||
en: 962b09e21305a04b
|
||||
zh: 382d2b8cce217569
|
||||
|
||||
@@ -67,7 +67,7 @@ The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-a
|
||||
|
||||
Path authorization for `read` and `read_image` belongs entirely to `ctx.fs`; media-type declarations and file signatures only decide whether `read_image` accepts the bytes returned by that backend.
|
||||
|
||||
With the policy plugin mounted, `write` and `edit` obtain their guard from the `fs/*` intent slots, so an unread target or a stale observation fails with `FS_NOT_OBSERVED` or `FS_STALE_VERSION` and a recovery instruction. Under a confining backend (`fs-sandbox`), `write`/`edit` additionally advertise `sandbox_permissions` and `justification`; a denied mutation returns the `[sandbox: file access denied under <mode> mode]` marker with the same-turn escalation hint, and an approved retry may stamp a strictly wider mode for that one call.
|
||||
With the policy plugin mounted, `write` and `edit` obtain their guard from the `fs/*` intent slots, so an unread target or a stale observation fails with `FS_NOT_OBSERVED` or `FS_STALE_VERSION` and a recovery instruction. Under a confining backend (`fs-sandbox`), `write`/`edit` additionally advertise `sandbox_permissions` and `justification`; a denied mutation returns the `[sandbox: file access denied under <mode> mode]` marker with the same-turn escalation hint, and an approved retry may stamp a strictly wider mode for that one call. The justification asks the model to use the language of the current user request.
|
||||
|
||||
### Failures and recovery
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ kind: "package-reference"
|
||||
|
||||
`read` 与 `read_image` 的路径授权完全由 `ctx.fs` 负责;媒体类型声明和文件签名只决定 `read_image` 是否接受该后端返回的字节。
|
||||
|
||||
挂载策略插件后,`write` 与 `edit` 从 `fs/*` 意图槽位取得防护,因此未读目标或陈旧观察会以 `FS_NOT_OBSERVED` 或 `FS_STALE_VERSION` 及恢复指令失败。使用施加沙箱限制的后端(`fs-sandbox`)时,`write`/`edit` 还会公开 `sandbox_permissions` 与 `justification`;被拒绝的变更返回 `[sandbox: file access denied under <mode> mode]` 标记与同轮次升级提示,获批的重试可以在该次调用中加盖严格更宽的模式。
|
||||
挂载策略插件后,`write` 与 `edit` 从 `fs/*` 意图槽位取得防护,因此未读目标或陈旧观察会以 `FS_NOT_OBSERVED` 或 `FS_STALE_VERSION` 及恢复指令失败。使用施加沙箱限制的后端(`fs-sandbox`)时,`write`/`edit` 还会公开 `sandbox_permissions` 与 `justification`;被拒绝的变更返回 `[sandbox: file access denied under <mode> mode]` 标记与同轮次升级提示,获批的重试可以在该次调用中加盖严格更宽的模式。理由字段提示模型使用用户当前提问的语言。
|
||||
|
||||
### 失败与恢复
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ export class FsSandboxController {
|
||||
justification: {
|
||||
type: 'string',
|
||||
description: 'Required with sandbox_permissions: one sentence for the user explaining '
|
||||
+ 'why this exact file operation needs the wider access.',
|
||||
+ 'why this exact file operation needs the wider access. Use the language of the user’s current request.',
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
en: d4ef1901ac78b431
|
||||
zh: 822b97f8bed1b2c9
|
||||
/deepseek-ai-dsh-user-approval/use-this-package/requesting-a-decision:
|
||||
en: add08f0d0dace4c8
|
||||
zh: e45268e0f0ed2e95
|
||||
en: dc465de82799bab0
|
||||
zh: 51144cc77bb15689
|
||||
/deepseek-ai-dsh-user-approval/use-this-package/what-the-model-and-user-see:
|
||||
en: 016bf3cd1891d3d7
|
||||
zh: 33e7e5ffaf95f5e7
|
||||
|
||||
@@ -49,7 +49,7 @@ The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-a
|
||||
|
||||
### Requesting a decision
|
||||
|
||||
`request(req)` names the agent, tool, optional call id and reason, and an abort signal. It requires an open turn: an idle or between-turn caller throws before auditing anything. Aborting withdraws the question — the request settles `cancelled` and a late answer is discarded. A failure that prevents either audit append from committing rejects instead of returning an unlogged decision.
|
||||
`request(req)` names the agent, tool, optional call id and reason, and an abort signal. Optional `displayReason` supplies localized presentation text without changing the logged reason. It requires an open turn: an idle or between-turn caller throws before auditing anything. Aborting withdraws the question — the request settles `cancelled` and a late answer is discarded. A failure that prevents either audit append from committing rejects instead of returning an unlogged decision.
|
||||
|
||||
### What the model and user see
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ kind: "package-reference"
|
||||
|
||||
### 请求决定
|
||||
|
||||
`request(req)` 指名 agent、工具、原因、可选的调用 id,以及一个中止信号。它要求当前处于尚未结束的轮次中:空闲或在轮次之间调用会在审计前抛出异常。中止会撤回问题——请求以 `cancelled` 结算,迟到的回答被丢弃。若任一审计事件在提交前失败,请求会被拒绝,而不会返回一项未记录的决定。
|
||||
`request(req)` 指名 agent、工具、原因、可选的调用 id,以及一个中止信号。可选的 `displayReason` 提供本地化展示文案,不改写日志中的原因。它要求当前处于尚未结束的轮次中:空闲或在轮次之间调用会在审计前抛出异常。中止会撤回问题——请求以 `cancelled` 结算,迟到的回答被丢弃。若任一审计事件在提交前失败,请求会被拒绝,而不会返回一项未记录的决定。
|
||||
|
||||
### 模型与用户看到什么
|
||||
|
||||
|
||||
@@ -69,6 +69,8 @@ export interface ApprovalRequestEvent {
|
||||
readonly callId?: ToolCallId
|
||||
/** Human-readable reason supplied by the asker. */
|
||||
readonly reason?: string
|
||||
/** Localized presentation only; never persisted in approval audit events. */
|
||||
readonly displayReason?: { readonly en: string; readonly [locale: string]: string }
|
||||
/** Cancellation lifetime of the pending request. */
|
||||
readonly signal?: AbortSignal
|
||||
}
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
---
|
||||
name: cordis-plugin-development
|
||||
description: Use when authoring, installing, configuring, or debugging persistent plugins and MCP connections in the current Harness profile, and for any visual object, decoration, or widget request that names no other destination, which means an installed UI plugin rendered in the Harness Web UI.
|
||||
description: Use when adding, enabling, disabling, installing, configuring, or debugging a plugin, bundle, feature, page, panel, tool, or MCP connection in the current Harness profile, including a shipped plugin that is disabled by default, and for any visual object, decoration, or widget request that names no other destination, which means an installed UI plugin rendered in the Harness Web UI.
|
||||
---
|
||||
|
||||
# Persistent Harness plugins
|
||||
|
||||
Use ordinary workspace files to author a bundle, then `plugin_manager` with `action: install_bundle` and the absolute package directory as `target` to install it in the current profile. Changes affect every session in that profile and survive restart. Load `editing-cordis-compositions` for agent preset changes.
|
||||
|
||||
Do not write the profile's `package.json` or `cordis.patch.yml`, create packages under `$DSH_HOME`, or run pnpm in the profile directory: `install_bundle` performs those steps, and each hand-made write outside the workspace needs its own approval. Every `plugin_manager` action, including `list_plugins` and `list_bundles`, also needs approval without Full access, so call it only when its result decides the next step.
|
||||
|
||||
## Enable a shipped plugin
|
||||
|
||||
A shipped bundle can resolve a plugin row and leave it `disabled`. The row id and its reason are in the shipped patch, `packages/bundle/*/cordis.patch.yml` in a source checkout. Write a workspace bundle whose patch overrides that row with `disabled: false` and inserts the Host rows it depends on; a source checkout's `apps/cli/config/examples/<feature>/cordis.yml` lists them for opt-in features. Packages shipped with dsh resolve from the dsh installation, so the bundle declares no dependencies on them. Install it with `install_bundle`.
|
||||
|
||||
## Deliver a working plugin first
|
||||
|
||||
1. Resolve the requested result and destination. An unspecified visual destination is the current Harness Web UI; a standalone image or HTML file does not complete such a request. Choose reasonable visual details and implement a small first version; install it before visual refinement.
|
||||
2. Discover only the APIs needed for that version: `cordis_inspect_list`, then targeted `cordis_inspect_query` calls. For UI, query Client `Slots.listSubTree` and the selected slot's registration options and props. For anything beyond a static decoration, such as tool policy, agent context, session-derived state, or Chat rows, read `references/practices.md` before choosing the extension point. Once the chosen slot and registration API are known, write the plugin.
|
||||
3. Read the matching template under `templates/` with the file-read tool and write its copies into one workspace directory, or write the installable package, patch, and required Host/Client files there yourself. Check JavaScript syntax and the manifest, then install it. Before that first installation, do not create preview HTML, mock shells, design variants, screenshot scripts, or rasterizer tooling. Use the installed plugin itself as the first preview.
|
||||
4. Read the installation result. After `application: applied`, exercise the capability or inspect the live Client registration. Use the connected page for visual verification when browser control is available. For a page or panel, also verify design consistency: styles use only theme tokens, the plugin imports no Harness Client package such as `@deepseek-ai/dsh-client-ui-primitives`, the console shows no slot entry crash, and the view reads correctly in light and dark themes beside a comparable host page. State any verification limitation explicitly; installation and slot registration alone do not establish what the user can see.
|
||||
4. Read the installation result: its `application` and `warnings` fields decide whether the change is live, not server logs, terminal output, process lists, or the page's boot payload. Confirm new rows with `cordis_inspect_query`, which needs no approval, rather than paging `list_plugins`. After `application: applied`, exercise the capability or inspect the live Client registration. Use the connected page for visual verification when browser control is available. For a page or panel, also verify design consistency: styles use only theme tokens, the plugin imports no Harness Client package such as `@deepseek-ai/dsh-client-ui-primitives`, the console shows no slot entry crash, and the view reads correctly in light and dark themes beside a comparable host page. State any verification limitation explicitly; installation and slot registration alone do not establish what the user can see.
|
||||
5. Fix observed defects in the same plugin. When the requested result works, finish with its location and verification status. Do not continue speculative visual variants, optional features, or a new mock preview. Close any task list you created.
|
||||
|
||||
## Knowledge sources, in order
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
en: ab093e9042b86b99
|
||||
zh: d173df7cb3649446
|
||||
/deepseek-ai-dsh-sandbox/use-this-package/denied-calls-and-escalation:
|
||||
en: ff24616d2a68ff77
|
||||
zh: 49cb99b3d941dab1
|
||||
en: 92cf42bad65d112c
|
||||
zh: 60fa2cb7e9c4c556
|
||||
/deepseek-ai-dsh-sandbox/use-this-package/fail-closed-behavior:
|
||||
en: 6bf240632a7a6bf5
|
||||
zh: ebf414f5cf435875
|
||||
|
||||
@@ -63,7 +63,7 @@ Enforcement is reported per call: `full` means the backend governs every promise
|
||||
|
||||
### Denied calls and escalation
|
||||
|
||||
When a confined call is denied, the operation reports a denial marker naming the mode — `[sandbox: file access denied under <mode> mode]` — and, when the composition advertises escalation, an escalation hint. The model may retry the exact call once with `sandbox_permissions` (the narrowest wider mode that suffices) plus a `justification`; the user sees one approval prompt and can allow once, reject, or cancel. A wider mode requires approval and applies to that one call only. Repeating the call's effective mode succeeds without approval; narrower targets remain invalid.
|
||||
When a confined call is denied, the operation reports a denial marker naming the mode — `[sandbox: file access denied under <mode> mode]` — and, when the composition advertises escalation, an escalation hint. The model may retry the exact call once with `sandbox_permissions` (the narrowest wider mode that suffices) plus a `justification`; the approval service obtains consent for the operation. The request retains its audit reason and supplies English and Chinese presentation copy with the model's justification unchanged. Missing translations follow the locale service's fallback chain, ultimately English; requesters own their translated presentation text. A wider mode requires approval and applies to that one call only. Repeating the call's effective mode succeeds without approval; narrower targets remain invalid.
|
||||
|
||||
### Fail-closed behavior
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ kind: "package-reference"
|
||||
|
||||
### 被拒绝的调用与升权
|
||||
|
||||
受限调用被拒绝时,操作会报告指明模式的拒绝标记——`[sandbox: file access denied under <mode> mode]`——组合声明升权能力时还会给出升权提示。模型可以用 `sandbox_permissions`(足以放行的最窄更宽模式)加 `justification` 重试一次完全相同的调用;用户会看到一次审批提示,可以选择允许一次、拒绝或取消。更宽的模式需要审批,且只作用于该次调用。重复指定调用的生效模式无需审批即可成功;更窄的目标仍然无效。
|
||||
受限调用被拒绝时,操作会报告指明模式的拒绝标记——`[sandbox: file access denied under <mode> mode]`——组合声明升权能力时还会给出升权提示。模型可以用 `sandbox_permissions`(足以放行的最窄更宽模式)加 `justification` 重试一次完全相同的调用;审批服务为操作取得同意。请求保留审计原因,同时提供英文和中文展示文案,模型给出的理由保持原样。缺失的译文遵循语言服务的回退链,最终回退到英文;请求方负责自己的展示译文。更宽的模式需要审批,且只作用于该次调用。重复指定调用的生效模式无需审批即可成功;更窄的目标仍然无效。
|
||||
|
||||
### 故障关闭行为
|
||||
|
||||
|
||||
@@ -102,10 +102,17 @@ export type EscalationOutcome = 'allowed-once' | 'rejected' | 'cancelled' | 'una
|
||||
export interface EscalationApprover<A = object, C = string> {
|
||||
/**
|
||||
* Ask the human to approve one action, resolving to a closed outcome.
|
||||
* @param req - the audit-self-contained request (agent, tool, call id, reason, optional signal).
|
||||
* @param req - the audit request with optional localized displayReason and presentation lifetime signal.
|
||||
* @returns the human's decision as a closed {@link EscalationOutcome}.
|
||||
*/
|
||||
request(req: { agent: A; toolName: string; callId: C; reason: string; signal?: AbortSignal }): Promise<EscalationOutcome>
|
||||
request(req: {
|
||||
agent: A
|
||||
toolName: string
|
||||
callId: C
|
||||
reason: string
|
||||
displayReason?: { readonly en: string; readonly [locale: string]: string }
|
||||
signal?: AbortSignal
|
||||
}): Promise<EscalationOutcome>
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,6 +179,10 @@ export async function approveEscalation<A, C>(request: EscalationRequest, approv
|
||||
toolName: approval.toolName,
|
||||
callId: approval.callId,
|
||||
reason: `escalate sandbox to ${mode}: ${justification}`,
|
||||
displayReason: {
|
||||
en: `Allow this operation with ${mode} permissions: ${justification}`,
|
||||
zh: `允许本次操作使用 ${mode} 权限:${justification}`,
|
||||
},
|
||||
...approval.signal ? { signal: approval.signal } : {},
|
||||
})
|
||||
switch (outcome) {
|
||||
|
||||
@@ -79,6 +79,12 @@ describe('approveEscalation', () => {
|
||||
const granted = await approveEscalation(req(), ingredients({ approver: approver('allowed-once', r => seen.push(r as { reason?: string })) }))
|
||||
expect(granted).toBe('workspace-write')
|
||||
expect(seen[0]?.reason).toBe('escalate sandbox to workspace-write: the user asked to write in the workspace')
|
||||
expect(seen[0]).toMatchObject({
|
||||
displayReason: {
|
||||
en: 'Allow this operation with workspace-write permissions: the user asked to write in the workspace',
|
||||
zh: '允许本次操作使用 workspace-write 权限:the user asked to write in the workspace',
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it.each(ESCALATION_TARGETS)('repeating %s succeeds without asking for approval', async (mode) => {
|
||||
|
||||
@@ -75,8 +75,8 @@
|
||||
en: 3039bc5e7a796b21
|
||||
zh: 6b7a9eaf69c9ea53
|
||||
/deepseek-ai-dsh-tool-bash/model-experience/tool-schemas/what-the-model-sees:
|
||||
en: 2580605a7e7b431a
|
||||
zh: 0cb6dfde14f3e215
|
||||
en: d1ac6102f35ec68c
|
||||
zh: 43d7e605b95096c5
|
||||
/deepseek-ai-dsh-tool-bash/model-experience/tool-schemas/token-effect:
|
||||
en: cdbd4262314e6856
|
||||
zh: e8c12c0cf5492386
|
||||
|
||||
@@ -151,7 +151,7 @@ Prefix-stable while the registration scope and prompt text are unchanged. Plugin
|
||||
|
||||
#### What the model sees
|
||||
|
||||
The model sees the generated [`bash` schema](../../../docs/tool-catalog.md#deepseek-aidsh-tool-bash). `run_in_background` appears only when this producer enables it and a job registry is composed; `sandbox_permissions` and `justification` appear only when the mounted executor advertises sandboxing. Agent-scoped tool restrictions can remove the definition for that agent.
|
||||
The model sees the generated [`bash` schema](../../../docs/tool-catalog.md#deepseek-aidsh-tool-bash). `run_in_background` appears only when this producer enables it and a job registry is composed; `sandbox_permissions` and `justification` appear only when the mounted executor advertises sandboxing; the justification asks the model to use the language of the current user request. Agent-scoped tool restrictions can remove the definition for that agent.
|
||||
|
||||
#### Token effect
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ Check the [exit code: N] marker on every bash result; investigate failures befor
|
||||
|
||||
#### 模型看到什么
|
||||
|
||||
模型会看到生成的 [`bash` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-bash)。仅当本生产方启用 `run_in_background` 且组合中有 job 注册表时,该字段才会出现;仅当已挂载执行器声明支持沙箱时,`sandbox_permissions` 和 `justification` 才会出现。按 agent 作用域限制工具可以移除该 agent 的定义。
|
||||
模型会看到生成的 [`bash` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-bash)。仅当本生产方启用 `run_in_background` 且组合中有 job 注册表时,该字段才会出现;仅当已挂载执行器声明支持沙箱时,`sandbox_permissions` 和 `justification` 才会出现;理由字段提示模型使用用户当前提问的语言。按 agent 作用域限制工具可以移除该 agent 的定义。
|
||||
|
||||
#### Token 影响
|
||||
|
||||
|
||||
@@ -422,7 +422,8 @@ export function apply(ctx: Context, config: Config = {}): void {
|
||||
},
|
||||
justification: {
|
||||
type: 'string' as const,
|
||||
description: 'Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access.',
|
||||
description: 'Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. '
|
||||
+ 'Use the language of the user’s current request.',
|
||||
},
|
||||
} : {},
|
||||
},
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
en: d2b292d651535d34
|
||||
zh: 1c0ebf140458759c
|
||||
/deepseek-ai-dsh-tool-pwsh/use-this-package/windows-specific-sandbox-behavior:
|
||||
en: a2d3592afd0c5678
|
||||
zh: dc9ef914149c3604
|
||||
en: 76f3f791f53d1005
|
||||
zh: e5b262db24e6eb83
|
||||
/deepseek-ai-dsh-tool-pwsh/use-this-package/what-can-go-wrong:
|
||||
en: c1a9cc1201ed3a89
|
||||
zh: a43a659d350e9d4a
|
||||
@@ -72,8 +72,8 @@
|
||||
en: 3039bc5e7a796b21
|
||||
zh: 6b7a9eaf69c9ea53
|
||||
/deepseek-ai-dsh-tool-pwsh/model-experience/tool-schemas/what-the-model-sees:
|
||||
en: 74ab02476c1e08e3
|
||||
zh: 3327fa00a5e38833
|
||||
en: 319b3a4512305a26
|
||||
zh: fed6a1c70bf79a0e
|
||||
/deepseek-ai-dsh-tool-pwsh/model-experience/tool-schemas/token-effect:
|
||||
en: 97cce067584eadff
|
||||
zh: 54b1f5cd5899e7f3
|
||||
|
||||
@@ -60,7 +60,7 @@ With a job registry composed, a foreground command is registered with `ctx.jobs`
|
||||
|
||||
### Windows-specific sandbox behavior
|
||||
|
||||
Under a sandboxing executor, denied commands report `[sandbox: file access denied under <mode> mode]`, and the same one-shot escalation path applies: retry the exact command once with `sandbox_permissions` plus a `justification` through user approval. The tool also teaches two Windows-restricted-token contracts in its description: read-only pwsh runs in ConstrainedLanguage (`.NET` static calls, `Add-Type`, COM, and reflection fail with "only core types" errors), and in both confined modes programs cannot open named pipes, so a command that captures another program's output through piped stdio fails with EPERM — escalate the exact command once or restructure it to avoid capturing output.
|
||||
Under a sandboxing executor, denied commands report `[sandbox: file access denied under <mode> mode]`, and the same one-shot escalation path applies: retry the exact command once with `sandbox_permissions` plus a `justification` through user approval. The justification asks the model to use the language of the current user request. The tool also teaches two Windows-restricted-token contracts in its description: read-only pwsh runs in ConstrainedLanguage (`.NET` static calls, `Add-Type`, COM, and reflection fail with "only core types" errors), and in both confined modes programs cannot open named pipes, so a command that captures another program's output through piped stdio fails with EPERM — escalate the exact command once or restructure it to avoid capturing output.
|
||||
|
||||
### What can go wrong
|
||||
|
||||
@@ -143,7 +143,7 @@ Prefix-stable while the registration scope and prompt text are unchanged. Plugin
|
||||
|
||||
#### What the model sees
|
||||
|
||||
The model sees the generated [`pwsh` schema](../../../docs/tool-catalog.md#deepseek-aidsh-tool-pwsh). Agent-scoped tool restrictions can remove the definition for that agent.
|
||||
The model sees the generated [`pwsh` schema](../../../docs/tool-catalog.md#deepseek-aidsh-tool-pwsh). Its justification asks the model to use the language of the current user request. Agent-scoped tool restrictions can remove the definition for that agent.
|
||||
|
||||
#### Token effect
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ kind: "package-reference"
|
||||
|
||||
### Windows 特有的沙箱行为
|
||||
|
||||
在沙箱执行器下,被拒绝的命令会报告 `[sandbox: file access denied under <mode> mode]`,并适用相同的单次升权路径:用 `sandbox_permissions` 加一句 `justification`,经用户审批后重试完全相同的命令一次。工具还会在其描述中教授两条 Windows 受限令牌约定:只读 pwsh 运行在 ConstrainedLanguage 中(`.NET` 静态调用、`Add-Type`、COM 与反射会以 "only core types" 错误失败);两种受限模式下程序都无法打开命名管道,因此通过管道 stdio 捕获另一程序输出的命令会以 EPERM 失败——请升权该确切命令一次,或重构命令以避免捕获输出。
|
||||
在沙箱执行器下,被拒绝的命令会报告 `[sandbox: file access denied under <mode> mode]`,并适用相同的单次升权路径:用 `sandbox_permissions` 加一句 `justification`,经用户审批后重试完全相同的命令一次。理由字段提示模型使用用户当前提问的语言。工具还会在其描述中教授两条 Windows 受限令牌约定:只读 pwsh 运行在 ConstrainedLanguage 中(`.NET` 静态调用、`Add-Type`、COM 与反射会以 "only core types" 错误失败);两种受限模式下程序都无法打开命名管道,因此通过管道 stdio 捕获另一程序输出的命令会以 EPERM 失败——请升权该确切命令一次,或重构命令以避免捕获输出。
|
||||
|
||||
### 可能出什么问题
|
||||
|
||||
@@ -143,7 +143,7 @@ Non-zero exits are reported as `[exit code: N]` markers; investigate failures be
|
||||
|
||||
#### 模型看到什么
|
||||
|
||||
模型会看到生成的 [`pwsh` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-pwsh)。按 agent 作用域实施的工具限制可以移除该 agent 的定义。
|
||||
模型会看到生成的 [`pwsh` schema](../../../docs/tool-catalog.zh.md#deepseek-aidsh-tool-pwsh)。其理由字段提示模型使用用户当前提问的语言。按 agent 作用域实施的工具限制可以移除该 agent 的定义。
|
||||
|
||||
#### Token 影响
|
||||
|
||||
|
||||
@@ -432,7 +432,8 @@ export function apply(ctx: Context, config: Config = {}): void {
|
||||
},
|
||||
justification: {
|
||||
type: 'string' as const,
|
||||
description: 'Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access.',
|
||||
description: 'Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. '
|
||||
+ 'Use the language of the user’s current request.',
|
||||
},
|
||||
} : {},
|
||||
},
|
||||
|
||||
@@ -460,8 +460,7 @@
|
||||
"6c63f71c0aeb1a9a97ec28a3242f77eef021ecfcee48238f17592eb2f1040c09": 1
|
||||
},
|
||||
"packages/client/ui-approval/tests/ui-approval.client.spec.tsx": {
|
||||
"3e392ff0165a51a6ac716515b99af35ec152f89607cff72080cb9afbcff63f46": 1,
|
||||
"d3a081f97422a352526b7014a6aa4c6c8f78cb27587568bc4150232db2037198": 1
|
||||
"3e392ff0165a51a6ac716515b99af35ec152f89607cff72080cb9afbcff63f46": 1
|
||||
},
|
||||
"packages/client/ui-attachment/tests/attachment-rail.client.spec.tsx": {
|
||||
"b42ab24a43e0f7542bf1deb8f7ac3a76698d29e098f8dc575af6c08774987c32": 1
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -658,7 +658,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -608,7 +608,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -633,7 +633,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -652,7 +652,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -713,7 +713,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -1220,7 +1220,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -62,7 +62,7 @@ interface ToolArgsMap {
|
||||
run_in_background?: boolean;
|
||||
/** The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say "create a goal". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority. */
|
||||
@@ -84,7 +84,7 @@ interface ToolArgsMap {
|
||||
replace_all?: boolean;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again. */
|
||||
@@ -252,7 +252,7 @@ interface ToolArgsMap {
|
||||
content: string;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -328,7 +328,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -641,7 +641,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -711,7 +711,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -713,7 +713,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -817,7 +817,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -652,7 +652,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -713,7 +713,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -1220,7 +1220,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -690,7 +690,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -143,7 +143,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -650,7 +650,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -62,7 +62,7 @@ interface ToolArgsMap {
|
||||
run_in_background?: boolean;
|
||||
/** The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before writing or configuring a plugin, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call. */
|
||||
@@ -97,7 +97,7 @@ interface ToolArgsMap {
|
||||
replace_all?: boolean;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again. */
|
||||
@@ -265,7 +265,7 @@ interface ToolArgsMap {
|
||||
content: string;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -138,7 +138,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -369,7 +369,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -682,7 +682,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -652,7 +652,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -713,7 +713,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -1228,7 +1228,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -1275,7 +1275,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -1336,7 +1336,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -1843,7 +1843,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -77,7 +77,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -463,7 +463,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -641,7 +641,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -72,7 +72,7 @@ interface ToolArgsMap {
|
||||
run_in_background?: boolean;
|
||||
/** The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say "create a goal". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority. */
|
||||
@@ -94,7 +94,7 @@ interface ToolArgsMap {
|
||||
replace_all?: boolean;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again. */
|
||||
@@ -283,7 +283,7 @@ interface ToolArgsMap {
|
||||
content: string;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -665,7 +665,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -623,7 +623,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -559,7 +559,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -434,7 +434,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -665,7 +665,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -713,7 +713,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -774,7 +774,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -1412,7 +1412,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -665,7 +665,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -704,7 +704,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -654,7 +654,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -629,7 +629,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -604,7 +604,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -64,7 +64,7 @@ interface ToolArgsMap {
|
||||
run_in_background?: boolean;
|
||||
/** The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say "create a goal". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority. */
|
||||
@@ -86,7 +86,7 @@ interface ToolArgsMap {
|
||||
replace_all?: boolean;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again. */
|
||||
@@ -258,7 +258,7 @@ interface ToolArgsMap {
|
||||
content: string;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -64,7 +64,7 @@ interface ToolArgsMap {
|
||||
run_in_background?: boolean;
|
||||
/** The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say "create a goal". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority. */
|
||||
@@ -86,7 +86,7 @@ interface ToolArgsMap {
|
||||
replace_all?: boolean;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again. */
|
||||
@@ -258,7 +258,7 @@ interface ToolArgsMap {
|
||||
content: string;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -59,7 +59,7 @@ class BashArgs(TypedDict):
|
||||
run_in_background: NotRequired[bool]
|
||||
# The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval.
|
||||
sandbox_permissions: NotRequired[Literal["workspace-write", "danger-full-access"]]
|
||||
# Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access.
|
||||
# Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request.
|
||||
justification: NotRequired[str]
|
||||
# Additional keys beyond those declared are allowed.
|
||||
|
||||
@@ -139,7 +139,7 @@ class EditArgs(TypedDict):
|
||||
replace_all: NotRequired[bool]
|
||||
# The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval.
|
||||
sandbox_permissions: NotRequired[Literal["workspace-write", "danger-full-access"]]
|
||||
# Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access.
|
||||
# Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request.
|
||||
justification: NotRequired[str]
|
||||
# Additional keys beyond those declared are allowed.
|
||||
|
||||
@@ -500,7 +500,7 @@ class WriteArgs(TypedDict):
|
||||
content: str
|
||||
# The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval.
|
||||
sandbox_permissions: NotRequired[Literal["workspace-write", "danger-full-access"]]
|
||||
# Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access.
|
||||
# Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request.
|
||||
justification: NotRequired[str]
|
||||
# Additional keys beyond those declared are allowed.
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ interface ToolArgsMap {
|
||||
run_in_background?: boolean;
|
||||
/** The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say "create a goal". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority. */
|
||||
@@ -86,7 +86,7 @@ interface ToolArgsMap {
|
||||
replace_all?: boolean;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again. */
|
||||
@@ -254,7 +254,7 @@ interface ToolArgsMap {
|
||||
content: string;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ interface ToolArgsMap {
|
||||
run_in_background?: boolean;
|
||||
/** The wider sandbox mode this command needs. Only valid as a one-shot retry of a command the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say "create a goal". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority. */
|
||||
@@ -86,7 +86,7 @@ interface ToolArgsMap {
|
||||
replace_all?: boolean;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
/** Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again. */
|
||||
@@ -258,7 +258,7 @@ interface ToolArgsMap {
|
||||
content: string;
|
||||
/** The wider sandbox mode this file operation needs. Only valid as a one-shot retry of an operation the sandbox just denied; requires justification and user approval. */
|
||||
sandbox_permissions?: "workspace-write" | "danger-full-access";
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. */
|
||||
/** Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request. */
|
||||
justification?: string;
|
||||
} & Record<string, JsonValue>;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval."
|
||||
"description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact command needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -97,7 +97,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -733,7 +733,7 @@
|
||||
},
|
||||
"justification": {
|
||||
"type": "string",
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
||||
"description": "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
Loaded 100 of 120 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user