@galaxy-stack/ai-coder-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/approval/approval-policy.d.ts +31 -0
- package/dist/approval/approval-policy.d.ts.map +1 -0
- package/dist/approval/approval-policy.js +179 -0
- package/dist/approval/approval-policy.js.map +1 -0
- package/dist/approval/index.d.ts +2 -0
- package/dist/approval/index.d.ts.map +1 -0
- package/dist/approval/index.js +2 -0
- package/dist/approval/index.js.map +1 -0
- package/dist/context/attachment-types.d.ts +35 -0
- package/dist/context/attachment-types.d.ts.map +1 -0
- package/dist/context/attachment-types.js +9 -0
- package/dist/context/attachment-types.js.map +1 -0
- package/dist/context/checkpoint.d.ts +194 -0
- package/dist/context/checkpoint.d.ts.map +1 -0
- package/dist/context/checkpoint.js +921 -0
- package/dist/context/checkpoint.js.map +1 -0
- package/dist/context/context-manager.d.ts +153 -0
- package/dist/context/context-manager.d.ts.map +1 -0
- package/dist/context/context-manager.js +541 -0
- package/dist/context/context-manager.js.map +1 -0
- package/dist/context/context-profile.d.ts +42 -0
- package/dist/context/context-profile.d.ts.map +1 -0
- package/dist/context/context-profile.js +102 -0
- package/dist/context/context-profile.js.map +1 -0
- package/dist/context/index.d.ts +7 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +7 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/token-ledger.d.ts +102 -0
- package/dist/context/token-ledger.d.ts.map +1 -0
- package/dist/context/token-ledger.js +205 -0
- package/dist/context/token-ledger.js.map +1 -0
- package/dist/context/tool-output.d.ts +46 -0
- package/dist/context/tool-output.d.ts.map +1 -0
- package/dist/context/tool-output.js +82 -0
- package/dist/context/tool-output.js.map +1 -0
- package/dist/deterministic-order.d.ts +3 -0
- package/dist/deterministic-order.d.ts.map +1 -0
- package/dist/deterministic-order.js +5 -0
- package/dist/deterministic-order.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/approval-port.d.ts +29 -0
- package/dist/ports/approval-port.d.ts.map +1 -0
- package/dist/ports/approval-port.js +9 -0
- package/dist/ports/approval-port.js.map +1 -0
- package/dist/ports/artifact-port.d.ts +66 -0
- package/dist/ports/artifact-port.d.ts.map +1 -0
- package/dist/ports/artifact-port.js +9 -0
- package/dist/ports/artifact-port.js.map +1 -0
- package/dist/ports/capability-port.d.ts +62 -0
- package/dist/ports/capability-port.d.ts.map +1 -0
- package/dist/ports/capability-port.js +9 -0
- package/dist/ports/capability-port.js.map +1 -0
- package/dist/ports/coding-model-port.d.ts +12 -0
- package/dist/ports/coding-model-port.d.ts.map +1 -0
- package/dist/ports/coding-model-port.js +9 -0
- package/dist/ports/coding-model-port.js.map +1 -0
- package/dist/ports/command-port.d.ts +94 -0
- package/dist/ports/command-port.d.ts.map +1 -0
- package/dist/ports/command-port.js +9 -0
- package/dist/ports/command-port.js.map +1 -0
- package/dist/ports/execution-context.d.ts +30 -0
- package/dist/ports/execution-context.d.ts.map +1 -0
- package/dist/ports/execution-context.js +11 -0
- package/dist/ports/execution-context.js.map +1 -0
- package/dist/ports/git-port.d.ts +27 -0
- package/dist/ports/git-port.d.ts.map +1 -0
- package/dist/ports/git-port.js +9 -0
- package/dist/ports/git-port.js.map +1 -0
- package/dist/ports/host-adapter.d.ts +36 -0
- package/dist/ports/host-adapter.d.ts.map +1 -0
- package/dist/ports/host-adapter.js +9 -0
- package/dist/ports/host-adapter.js.map +1 -0
- package/dist/ports/index.d.ts +16 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +16 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/pagination.d.ts +17 -0
- package/dist/ports/pagination.d.ts.map +1 -0
- package/dist/ports/pagination.js +9 -0
- package/dist/ports/pagination.js.map +1 -0
- package/dist/ports/persistence-port.d.ts +59 -0
- package/dist/ports/persistence-port.d.ts.map +1 -0
- package/dist/ports/persistence-port.js +9 -0
- package/dist/ports/persistence-port.js.map +1 -0
- package/dist/ports/port-result.d.ts +29 -0
- package/dist/ports/port-result.d.ts.map +1 -0
- package/dist/ports/port-result.js +20 -0
- package/dist/ports/port-result.js.map +1 -0
- package/dist/ports/preview-port.d.ts +27 -0
- package/dist/ports/preview-port.d.ts.map +1 -0
- package/dist/ports/preview-port.js +9 -0
- package/dist/ports/preview-port.js.map +1 -0
- package/dist/ports/research-port.d.ts +40 -0
- package/dist/ports/research-port.d.ts.map +1 -0
- package/dist/ports/research-port.js +9 -0
- package/dist/ports/research-port.js.map +1 -0
- package/dist/ports/trace-port.d.ts +26 -0
- package/dist/ports/trace-port.d.ts.map +1 -0
- package/dist/ports/trace-port.js +9 -0
- package/dist/ports/trace-port.js.map +1 -0
- package/dist/ports/workspace-port.d.ts +126 -0
- package/dist/ports/workspace-port.d.ts.map +1 -0
- package/dist/ports/workspace-port.js +9 -0
- package/dist/ports/workspace-port.js.map +1 -0
- package/dist/prompt/index.d.ts +2 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +2 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/prompt-assembler.d.ts +114 -0
- package/dist/prompt/prompt-assembler.d.ts.map +1 -0
- package/dist/prompt/prompt-assembler.js +363 -0
- package/dist/prompt/prompt-assembler.js.map +1 -0
- package/dist/retrieval/evidence.d.ts +41 -0
- package/dist/retrieval/evidence.d.ts.map +1 -0
- package/dist/retrieval/evidence.js +48 -0
- package/dist/retrieval/evidence.js.map +1 -0
- package/dist/retrieval/index.d.ts +4 -0
- package/dist/retrieval/index.d.ts.map +1 -0
- package/dist/retrieval/index.js +4 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/lexical-retriever.d.ts +56 -0
- package/dist/retrieval/lexical-retriever.d.ts.map +1 -0
- package/dist/retrieval/lexical-retriever.js +128 -0
- package/dist/retrieval/lexical-retriever.js.map +1 -0
- package/dist/retrieval/retrieval-policy.d.ts +25 -0
- package/dist/retrieval/retrieval-policy.d.ts.map +1 -0
- package/dist/retrieval/retrieval-policy.js +71 -0
- package/dist/retrieval/retrieval-policy.js.map +1 -0
- package/dist/runtime/completion-gate.d.ts +75 -0
- package/dist/runtime/completion-gate.d.ts.map +1 -0
- package/dist/runtime/completion-gate.js +114 -0
- package/dist/runtime/completion-gate.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +7 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/run-controller.d.ts +55 -0
- package/dist/runtime/run-controller.d.ts.map +1 -0
- package/dist/runtime/run-controller.js +2673 -0
- package/dist/runtime/run-controller.js.map +1 -0
- package/dist/runtime/runtime-error.d.ts +7 -0
- package/dist/runtime/runtime-error.d.ts.map +1 -0
- package/dist/runtime/runtime-error.js +11 -0
- package/dist/runtime/runtime-error.js.map +1 -0
- package/dist/runtime/runtime-types.d.ts +303 -0
- package/dist/runtime/runtime-types.d.ts.map +1 -0
- package/dist/runtime/runtime-types.js +2 -0
- package/dist/runtime/runtime-types.js.map +1 -0
- package/dist/runtime/state-machine.d.ts +27 -0
- package/dist/runtime/state-machine.d.ts.map +1 -0
- package/dist/runtime/state-machine.js +68 -0
- package/dist/runtime/state-machine.js.map +1 -0
- package/dist/runtime/trace-emitter.d.ts +17 -0
- package/dist/runtime/trace-emitter.d.ts.map +1 -0
- package/dist/runtime/trace-emitter.js +91 -0
- package/dist/runtime/trace-emitter.js.map +1 -0
- package/dist/tools/coding-messages.d.ts +112 -0
- package/dist/tools/coding-messages.d.ts.map +1 -0
- package/dist/tools/coding-messages.js +20 -0
- package/dist/tools/coding-messages.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/json-schema.d.ts +18 -0
- package/dist/tools/json-schema.d.ts.map +1 -0
- package/dist/tools/json-schema.js +299 -0
- package/dist/tools/json-schema.js.map +1 -0
- package/dist/tools/settings-types.d.ts +41 -0
- package/dist/tools/settings-types.d.ts.map +1 -0
- package/dist/tools/settings-types.js +88 -0
- package/dist/tools/settings-types.js.map +1 -0
- package/dist/tools/tool-effect-profile.d.ts +44 -0
- package/dist/tools/tool-effect-profile.d.ts.map +1 -0
- package/dist/tools/tool-effect-profile.js +157 -0
- package/dist/tools/tool-effect-profile.js.map +1 -0
- package/dist/tools/tool-registry-types.d.ts +72 -0
- package/dist/tools/tool-registry-types.d.ts.map +1 -0
- package/dist/tools/tool-registry-types.js +9 -0
- package/dist/tools/tool-registry-types.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +155 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +599 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/tool-registry.schema.json +144 -0
- package/docs/ARCHITECTURE.md +259 -0
- package/docs/HOST_CONFORMANCE.md +210 -0
- package/docs/PROMPT_CONTRACT.md +123 -0
- package/docs/TOOL_EFFECT_PROFILE.md +77 -0
- package/docs/TOOL_REGISTRY_COMPARISON.md +358 -0
- package/package.json +76 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Galaxy Agent
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# @galaxy-stack/ai-coder-core
|
|
2
|
+
|
|
3
|
+
Provider-neutral, platform-neutral runtime for the Galaxy AI Coder single agent.
|
|
4
|
+
The same core is intended for:
|
|
5
|
+
|
|
6
|
+
- `galaxy-code` v2 — deterministic Node.js CLI laboratory;
|
|
7
|
+
- `galaxy-vscode-extension` — VS Code host adapters;
|
|
8
|
+
- `galaxy-desktop` — Tauri host adapters.
|
|
9
|
+
|
|
10
|
+
## Status
|
|
11
|
+
|
|
12
|
+
The single-agent runtime, context manager, prompt assembler, tool registry,
|
|
13
|
+
approval policy, checkpoint format, trace protocol, lexical retrieval, and
|
|
14
|
+
completion gate are implemented and covered by deterministic tests.
|
|
15
|
+
|
|
16
|
+
`galaxy-code` v2 is the reference conformance host. VS Code and Desktop should
|
|
17
|
+
not copy runtime logic; they should implement the same ports and pass the same
|
|
18
|
+
host conformance fixtures first.
|
|
19
|
+
|
|
20
|
+
This package is still pre-integration (`0.1.0`, private). Optional MCP,
|
|
21
|
+
semantic retrieval, background terminal sessions, and subagents are outside
|
|
22
|
+
the current runtime baseline.
|
|
23
|
+
|
|
24
|
+
## Non-negotiable invariants
|
|
25
|
+
|
|
26
|
+
1. One AI owns the run state. There is no hidden planner/reviewer agent.
|
|
27
|
+
2. A model round may emit zero or more correlated tool calls. IDs must be
|
|
28
|
+
non-empty and unique for the run; names may repeat with different arguments.
|
|
29
|
+
The runtime preflights the complete batch, then executes it sequentially in
|
|
30
|
+
emitted order.
|
|
31
|
+
3. The model sees model-facing names; every result must match the host's
|
|
32
|
+
model-name-to-canonical-ID mapping.
|
|
33
|
+
4. Hosts provide structured prompt policy only. Runtime assembles and hashes
|
|
34
|
+
the system prompt after capability and registry discovery, then formats the
|
|
35
|
+
sole user task from `AiCoderTaskContract`. If `command.run` is active, the
|
|
36
|
+
host must supply the exact concrete non-interactive interpreter contract;
|
|
37
|
+
the runtime refuses missing/unknown shell metadata before a model request.
|
|
38
|
+
5. Tool text is never parsed into trusted state. Only declared host effects
|
|
39
|
+
can change inspection, write, validation, diff, plan, approval, or criterion
|
|
40
|
+
evidence.
|
|
41
|
+
6. Every host effect is checked against a per-canonical-tool capability policy.
|
|
42
|
+
Built-in hosts derive that policy from the exported versioned core profile;
|
|
43
|
+
divergent local copies are rejected at runtime startup.
|
|
44
|
+
7. Every mutation uses a precondition and records distinct before/after state:
|
|
45
|
+
create has a null `beforeHash`, delete has a null `afterHash`, and at least
|
|
46
|
+
one hash is non-null. Later validation has explicit workspace/path scope.
|
|
47
|
+
8. Validation and final diff evidence must match the final serialized workspace
|
|
48
|
+
fingerprint before completion.
|
|
49
|
+
9. A required acceptance criterion must be `satisfied`; `waived` does not close
|
|
50
|
+
a required criterion.
|
|
51
|
+
10. Checkpoints are cloned before validation, deeply frozen after validation,
|
|
52
|
+
redacted, hashed with SHA-256, and resumed only from trusted host storage (or
|
|
53
|
+
an explicit `trusted_host` provenance assertion).
|
|
54
|
+
11. Cancellation makes an in-flight side-effect outcome `unknown` unless the
|
|
55
|
+
host returns a structured result. Hosts must honor the supplied signal and
|
|
56
|
+
absolute deadline.
|
|
57
|
+
12. Identical retries, alternating successful tool cycles, varied failed
|
|
58
|
+
mutations on one path/state, repeated validation failures on one
|
|
59
|
+
fingerprint, and returning content hashes are bounded. Semantically
|
|
60
|
+
identical validation, diff, and criterion evidence does not manufacture a
|
|
61
|
+
new state transition; unresolved no-progress episodes pause with a
|
|
62
|
+
checkpoint.
|
|
63
|
+
13. Provider-reported context overflow checkpoints, compacts, and recounts
|
|
64
|
+
before another model request. Mandatory state is never silently dropped to
|
|
65
|
+
force a round through.
|
|
66
|
+
14. Once a mutation has complete current validation and final-diff evidence,
|
|
67
|
+
the next model turn is a bounded finalization turn with no tool definitions.
|
|
68
|
+
Evidence-complete no-progress recovery uses the same boundary; ordinary
|
|
69
|
+
inspect-then-edit or multi-step review work is not finalized early. A
|
|
70
|
+
verified resume re-derives this boundary before its first model request.
|
|
71
|
+
|
|
72
|
+
## Runtime flow
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
request
|
|
76
|
+
-> capability + tool-policy snapshot
|
|
77
|
+
-> core-owned prompt snapshot + canonical user-task contract
|
|
78
|
+
-> bounded context assembly
|
|
79
|
+
-> one streamed model round
|
|
80
|
+
-> zero or more correlated tool calls
|
|
81
|
+
-> atomic batch preflight (IDs, budget, visible registry, canonical JSON)
|
|
82
|
+
-> sequential per-call schema/policy/approval/host adapter
|
|
83
|
+
-> bounded untrusted observation + trusted declared effects
|
|
84
|
+
-> repeat
|
|
85
|
+
-> evidence-ready tool-free finalization turn
|
|
86
|
+
-> final report candidate
|
|
87
|
+
-> model-actionable evidence gate
|
|
88
|
+
-> runtime-owned final-report persistence (when a store is configured)
|
|
89
|
+
-> completion-gate trace + durable trace flush (when trace is configured)
|
|
90
|
+
-> fresh workspace fingerprint
|
|
91
|
+
-> deterministic completion gate
|
|
92
|
+
-> completed
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
See [ARCHITECTURE.md](docs/ARCHITECTURE.md),
|
|
96
|
+
[PROMPT_CONTRACT.md](docs/PROMPT_CONTRACT.md),
|
|
97
|
+
[TOOL_EFFECT_PROFILE.md](docs/TOOL_EFFECT_PROFILE.md), and
|
|
98
|
+
[HOST_CONFORMANCE.md](docs/HOST_CONFORMANCE.md) for integration contracts.
|
|
99
|
+
|
|
100
|
+
## Source layout
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
src/
|
|
104
|
+
├── approval/ # fail-closed approval policy
|
|
105
|
+
├── context/ # context budget, token ledger, checkpoints, output bounds
|
|
106
|
+
├── ports/ # host capability interfaces and PortResult
|
|
107
|
+
├── prompt/ # versioned system prompt assembly
|
|
108
|
+
├── retrieval/ # bounded provider-neutral lexical evidence
|
|
109
|
+
├── runtime/ # run controller, state machine, completion gate, trace emitter
|
|
110
|
+
└── tools/ # schemas, descriptors, registry and provider protocol
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Development
|
|
114
|
+
|
|
115
|
+
Requires Node.js 20 or newer.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npm install
|
|
119
|
+
npm run verify
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`npm run verify` runs strict TypeScript checks, all source tests, a clean build,
|
|
123
|
+
and a public `dist` smoke test. `npm pack --dry-run` should also be checked
|
|
124
|
+
before publishing or consuming the package from another repository.
|
|
125
|
+
|
|
126
|
+
The deterministic end-to-end host gate lives in `galaxy-code`:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
cd ../../galaxy-code
|
|
130
|
+
npm run check
|
|
131
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Bùi Trọng Hiếu
|
|
3
|
+
* @email kevinbui210191@gmail.com
|
|
4
|
+
* @create date 2026-08-21
|
|
5
|
+
* @modify date 2026-08-28
|
|
6
|
+
* @desc Fail-closed approval, permission, transport, and task-mode policy.
|
|
7
|
+
*/
|
|
8
|
+
import type { ApprovalPort, AiCoderApprovalScope } from "../ports/approval-port.js";
|
|
9
|
+
import type { ToolExecutionContext } from "../ports/execution-context.js";
|
|
10
|
+
import type { AiCoderApprovalProfile } from "../tools/settings-types.js";
|
|
11
|
+
import type { AiCoderToolDescriptor, AiCoderToolTransport } from "../tools/tool-registry-types.js";
|
|
12
|
+
export type { AiCoderApprovalRequest } from "../ports/approval-port.js";
|
|
13
|
+
export type { ApprovalPort as AiCoderApprovalCallback } from "../ports/approval-port.js";
|
|
14
|
+
export type AiCoderApprovalPolicyDecision = Readonly<{
|
|
15
|
+
allowed: boolean;
|
|
16
|
+
approvalScope?: AiCoderApprovalScope;
|
|
17
|
+
decision: "approved_by_host" | "auto_approve" | "deny_approval_error" | "deny_approval_timeout" | "deny_approval_unavailable" | "deny_canceled" | "deny_missing_permission" | "deny_run_mode" | "deny_transport" | "denied_by_host";
|
|
18
|
+
reason: string;
|
|
19
|
+
requestId?: string;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function resolveAiCoderManifestPermissions(manifest: unknown): ReadonlySet<string>;
|
|
22
|
+
export declare function requiresAiCoderApproval(approvalProfile: AiCoderApprovalProfile, tool: AiCoderToolDescriptor): boolean;
|
|
23
|
+
export declare function createAiCoderApprovalPolicy(options: Readonly<{
|
|
24
|
+
allowedTransports?: ReadonlySet<AiCoderToolTransport>;
|
|
25
|
+
approvalCallback?: ApprovalPort;
|
|
26
|
+
approvalProfile: AiCoderApprovalProfile;
|
|
27
|
+
approvalTimeoutMs?: number;
|
|
28
|
+
grantedPermissions?: ReadonlySet<string>;
|
|
29
|
+
now?: () => number;
|
|
30
|
+
}>): (tool: AiCoderToolDescriptor, argumentsValue: Readonly<Record<string, unknown>>, context: ToolExecutionContext) => Promise<AiCoderApprovalPolicyDecision>;
|
|
31
|
+
//# sourceMappingURL=approval-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-policy.d.ts","sourceRoot":"","sources":["../../src/approval/approval-policy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,EAEZ,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAIzE,OAAO,KAAK,EACV,qBAAqB,EAErB,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,YAAY,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEzF,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,QAAQ,EACJ,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,uBAAuB,GACvB,2BAA2B,GAC3B,eAAe,GACf,yBAAyB,GACzB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAkBH,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAUxF;AAED,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,sBAAsB,EACvC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAGT;AA+CD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC5D,iBAAiB,CAAC,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACtD,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,eAAe,EAAE,sBAAsB,CAAC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC,IAOE,MAAM,qBAAqB,EAC3B,gBAAgB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACjD,SAAS,oBAAoB,KAC5B,OAAO,CAAC,6BAA6B,CAAC,CA2G1C"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Bùi Trọng Hiếu
|
|
3
|
+
* @email kevinbui210191@gmail.com
|
|
4
|
+
* @create date 2026-08-21
|
|
5
|
+
* @modify date 2026-08-28
|
|
6
|
+
* @desc Fail-closed approval, permission, transport, and task-mode policy.
|
|
7
|
+
*/
|
|
8
|
+
import { isAiCoderToolAllowedInMode, } from "../tools/tool-registry.js";
|
|
9
|
+
const RISK_ORDER = Object.freeze({
|
|
10
|
+
low: 0,
|
|
11
|
+
medium: 1,
|
|
12
|
+
high: 2,
|
|
13
|
+
critical: 3,
|
|
14
|
+
});
|
|
15
|
+
const APPROVAL_THRESHOLDS = Object.freeze({
|
|
16
|
+
"trusted-workspace": "critical",
|
|
17
|
+
balanced: "high",
|
|
18
|
+
strict: "medium",
|
|
19
|
+
});
|
|
20
|
+
const DEFAULT_ALLOWED_TRANSPORTS = new Set(["native", "core"]);
|
|
21
|
+
const DEFAULT_APPROVAL_TIMEOUT_MS = 30_000;
|
|
22
|
+
export function resolveAiCoderManifestPermissions(manifest) {
|
|
23
|
+
if (!manifest || typeof manifest !== "object")
|
|
24
|
+
return new Set();
|
|
25
|
+
const permissions = manifest.permissions;
|
|
26
|
+
if (!Array.isArray(permissions))
|
|
27
|
+
return new Set();
|
|
28
|
+
return new Set(permissions
|
|
29
|
+
.filter((value) => typeof value === "string")
|
|
30
|
+
.map((value) => value.trim())
|
|
31
|
+
.filter(Boolean));
|
|
32
|
+
}
|
|
33
|
+
export function requiresAiCoderApproval(approvalProfile, tool) {
|
|
34
|
+
if (tool.mutability === "external_side_effect")
|
|
35
|
+
return true;
|
|
36
|
+
return RISK_ORDER[tool.risk] >= RISK_ORDER[APPROVAL_THRESHOLDS[approvalProfile]];
|
|
37
|
+
}
|
|
38
|
+
function approvalReason(tool, approvalProfile) {
|
|
39
|
+
const detail = tool.mutability === "external_side_effect" ? "external side effect" : `${tool.risk} risk`;
|
|
40
|
+
return `Approval profile ${approvalProfile} yêu cầu xác nhận ${tool.id} (${detail}).`;
|
|
41
|
+
}
|
|
42
|
+
function waitForApproval(callback, request, context, timeoutMs) {
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
let settled = false;
|
|
45
|
+
const finish = (outcome) => {
|
|
46
|
+
if (settled)
|
|
47
|
+
return;
|
|
48
|
+
settled = true;
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
context.signal.removeEventListener("abort", onAbort);
|
|
51
|
+
resolve(outcome);
|
|
52
|
+
};
|
|
53
|
+
const onAbort = () => finish({ kind: "canceled" });
|
|
54
|
+
const timer = setTimeout(() => finish({ kind: "timeout" }), timeoutMs);
|
|
55
|
+
context.signal.addEventListener("abort", onAbort, { once: true });
|
|
56
|
+
if (context.signal.aborted) {
|
|
57
|
+
onAbort();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
void Promise.resolve().then(async () => {
|
|
61
|
+
if (settled)
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
const result = await callback(request, context);
|
|
65
|
+
finish({ kind: "result", result });
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
finish({ kind: "error", code: "APPROVAL_CALLBACK_THROWN" });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
export function createAiCoderApprovalPolicy(options) {
|
|
74
|
+
const allowedTransports = options.allowedTransports ?? DEFAULT_ALLOWED_TRANSPORTS;
|
|
75
|
+
const grantedPermissions = options.grantedPermissions ?? new Set();
|
|
76
|
+
const now = options.now ?? Date.now;
|
|
77
|
+
const configuredTimeout = Math.max(1, options.approvalTimeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS);
|
|
78
|
+
return async (tool, argumentsValue, context) => {
|
|
79
|
+
if (context.signal.aborted || now() >= context.deadline) {
|
|
80
|
+
return Object.freeze({
|
|
81
|
+
allowed: false,
|
|
82
|
+
decision: "deny_canceled",
|
|
83
|
+
reason: `Run ${context.runId} đã bị hủy hoặc hết deadline trước khi thực thi ${tool.id}.`,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (!isAiCoderToolAllowedInMode(tool, context.mode)) {
|
|
87
|
+
return Object.freeze({
|
|
88
|
+
allowed: false,
|
|
89
|
+
decision: "deny_run_mode",
|
|
90
|
+
reason: `Task mode ${context.mode} không cho phép ${tool.mutability} tool ${tool.id}.`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const missingPermissions = tool.permissions.filter((permission) => !grantedPermissions.has(permission));
|
|
94
|
+
if (missingPermissions.length > 0) {
|
|
95
|
+
return Object.freeze({
|
|
96
|
+
allowed: false,
|
|
97
|
+
decision: "deny_missing_permission",
|
|
98
|
+
reason: `Tool ${tool.id} thiếu permission ${missingPermissions.join(", ")} trong manifest AI Coder.`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (!allowedTransports.has(tool.transport)) {
|
|
102
|
+
return Object.freeze({
|
|
103
|
+
allowed: false,
|
|
104
|
+
decision: "deny_transport",
|
|
105
|
+
reason: `Transport ${tool.transport} của ${tool.id} chưa có policy adapter được host tin cậy.`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (!requiresAiCoderApproval(options.approvalProfile, tool)) {
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
allowed: true,
|
|
111
|
+
decision: "auto_approve",
|
|
112
|
+
reason: `Profile ${options.approvalProfile} cho phép ${tool.id} (${tool.risk}, ${tool.mutability}).`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const reason = approvalReason(tool, options.approvalProfile);
|
|
116
|
+
const requestId = `${context.runId}:${context.toolCallId}`;
|
|
117
|
+
if (!options.approvalCallback) {
|
|
118
|
+
return Object.freeze({
|
|
119
|
+
allowed: false,
|
|
120
|
+
decision: "deny_approval_unavailable",
|
|
121
|
+
reason: `${reason} Host không cung cấp approval callback nên yêu cầu bị từ chối.`,
|
|
122
|
+
requestId,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
const remainingMs = context.deadline - now();
|
|
126
|
+
if (remainingMs <= 0) {
|
|
127
|
+
return Object.freeze({
|
|
128
|
+
allowed: false,
|
|
129
|
+
decision: "deny_canceled",
|
|
130
|
+
reason: `${reason} Run đã hết deadline.`,
|
|
131
|
+
requestId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const request = Object.freeze({
|
|
135
|
+
approvalProfile: options.approvalProfile,
|
|
136
|
+
argumentsValue,
|
|
137
|
+
reason,
|
|
138
|
+
requestId,
|
|
139
|
+
suggestedScope: "once",
|
|
140
|
+
tool,
|
|
141
|
+
});
|
|
142
|
+
const outcome = await waitForApproval(options.approvalCallback, request, context, Math.min(configuredTimeout, remainingMs));
|
|
143
|
+
if (outcome.kind === "canceled") {
|
|
144
|
+
return Object.freeze({ allowed: false, decision: "deny_canceled", reason: `${reason} Approval bị hủy.`, requestId });
|
|
145
|
+
}
|
|
146
|
+
if (outcome.kind === "timeout") {
|
|
147
|
+
return Object.freeze({ allowed: false, decision: "deny_approval_timeout", reason: `${reason} Approval đã timeout.`, requestId });
|
|
148
|
+
}
|
|
149
|
+
if (outcome.kind === "error") {
|
|
150
|
+
return Object.freeze({ allowed: false, decision: "deny_approval_error", reason: `${reason} Host approval callback lỗi (${outcome.code}).`, requestId });
|
|
151
|
+
}
|
|
152
|
+
if (!outcome.result.ok) {
|
|
153
|
+
return Object.freeze({
|
|
154
|
+
allowed: false,
|
|
155
|
+
decision: "deny_approval_error",
|
|
156
|
+
reason: `${reason} Host trả lỗi ${outcome.result.error.code}: ${outcome.result.error.message}`,
|
|
157
|
+
requestId,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
const decision = outcome.result.data;
|
|
161
|
+
if (!decision.approved) {
|
|
162
|
+
return Object.freeze({
|
|
163
|
+
allowed: false,
|
|
164
|
+
approvalScope: decision.scope,
|
|
165
|
+
decision: "denied_by_host",
|
|
166
|
+
reason: decision.reason || `Host từ chối approval cho ${tool.id}.`,
|
|
167
|
+
requestId,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return Object.freeze({
|
|
171
|
+
allowed: true,
|
|
172
|
+
approvalScope: decision.scope,
|
|
173
|
+
decision: "approved_by_host",
|
|
174
|
+
reason: decision.reason || reason,
|
|
175
|
+
requestId,
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=approval-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../../src/approval/approval-policy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,EACL,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AA4BnC,MAAM,UAAU,GAA8C,MAAM,CAAC,MAAM,CAAC;IAC1E,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAA8D,MAAM,CAAC,MAAM,CAAC;IACnG,mBAAmB,EAAE,UAAU;IAC/B,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAsC,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAClG,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAE3C,MAAM,UAAU,iCAAiC,CAAC,QAAiB;IACjE,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAChE,MAAM,WAAW,GAAI,QAAsC,CAAC,WAAW,CAAC;IACxE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAClD,OAAO,IAAI,GAAG,CACZ,WAAW;SACR,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;SAC7D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,eAAuC,EACvC,IAA2B;IAE3B,IAAI,IAAI,CAAC,UAAU,KAAK,sBAAsB;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,cAAc,CAAC,IAA2B,EAAE,eAAuC;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC;IACzG,OAAO,oBAAoB,eAAe,qBAAqB,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC;AACxF,CAAC;AAQD,SAAS,eAAe,CACtB,QAAsB,EACtB,OAA+B,EAC/B,OAA6B,EAC7B,SAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,OAAwB,EAAE,EAAE;YAC1C,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACrC,IAAI,OAAO;gBAAE,OAAO;YACpB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAO1C;IACA,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;IAClF,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,GAAG,EAAU,CAAC;IAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,iBAAiB,IAAI,2BAA2B,CAAC,CAAC;IAEhG,OAAO,KAAK,EACV,IAA2B,EAC3B,cAAiD,EACjD,OAA6B,EACW,EAAE;QAC1C,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxD,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,eAAe;gBACzB,MAAM,EAAE,OAAO,OAAO,CAAC,KAAK,mDAAmD,IAAI,CAAC,EAAE,GAAG;aAC1F,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,eAAe;gBACzB,MAAM,EAAE,aAAa,OAAO,CAAC,IAAI,mBAAmB,IAAI,CAAC,UAAU,SAAS,IAAI,CAAC,EAAE,GAAG;aACvF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACxG,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,yBAAyB;gBACnC,MAAM,EAAE,QAAQ,IAAI,CAAC,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B;aACrG,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,gBAAgB;gBAC1B,MAAM,EAAE,aAAa,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC,EAAE,4CAA4C;aAC/F,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE,WAAW,OAAO,CAAC,eAAe,aAAa,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,IAAI;aACrG,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,2BAA2B;gBACrC,MAAM,EAAE,GAAG,MAAM,gEAAgE;gBACjF,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;QAC7C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,eAAe;gBACzB,MAAM,EAAE,GAAG,MAAM,uBAAuB;gBACxC,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAA2B,MAAM,CAAC,MAAM,CAAC;YACpD,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,cAAc;YACd,MAAM;YACN,SAAS;YACT,cAAc,EAAE,MAAM;YACtB,IAAI;SACL,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,eAAe,CACnC,OAAO,CAAC,gBAAgB,EACxB,OAAO,EACP,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CACzC,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC;QACvH,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,EAAE,SAAS,EAAE,CAAC,CAAC;QACnI,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,MAAM,gCAAgC,OAAO,CAAC,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1J,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,qBAAqB;gBAC/B,MAAM,EAAE,GAAG,MAAM,iBAAiB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC9F,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,aAAa,EAAE,QAAQ,CAAC,KAAK;gBAC7B,QAAQ,EAAE,gBAAgB;gBAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,6BAA6B,IAAI,CAAC,EAAE,GAAG;gBAClE,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,QAAQ,CAAC,KAAK;YAC7B,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,MAAM;YACjC,SAAS;SACV,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/approval/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/approval/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Bùi Trọng Hiếu
|
|
3
|
+
* @email kevinbui210191@gmail.com
|
|
4
|
+
* @create date 2026-08-21
|
|
5
|
+
* @modify date 2026-08-21
|
|
6
|
+
* @desc Chat attachment shape consumed by ContextManager, TokenLedger, and PromptAssembler.
|
|
7
|
+
*/
|
|
8
|
+
export type AiCoderAttachmentSource = "clipboard" | "generated" | "screen_capture" | "tool_output" | "user_upload" | "workspace";
|
|
9
|
+
/**
|
|
10
|
+
* Artifact-first attachment reference. Binary transport is optional because a
|
|
11
|
+
* host may resolve it lazily from `artifactId`; provenance and trust are never
|
|
12
|
+
* optional and dynamic content cannot become an instruction.
|
|
13
|
+
*/
|
|
14
|
+
export type AiCoderAttachment = Readonly<{
|
|
15
|
+
artifactId: string;
|
|
16
|
+
byteLength?: number;
|
|
17
|
+
contentSha256: string;
|
|
18
|
+
dataUrl?: string;
|
|
19
|
+
decodedPixels?: number;
|
|
20
|
+
height?: number;
|
|
21
|
+
mimeType: string;
|
|
22
|
+
name: string;
|
|
23
|
+
provenance: Readonly<{
|
|
24
|
+
locator?: string;
|
|
25
|
+
source: AiCoderAttachmentSource;
|
|
26
|
+
}>;
|
|
27
|
+
retention: "default" | "durable" | "temporary";
|
|
28
|
+
trust: "untrusted_data";
|
|
29
|
+
width?: number;
|
|
30
|
+
}>;
|
|
31
|
+
export type PreparedAiCoderAttachments = Readonly<{
|
|
32
|
+
directVision: readonly AiCoderAttachment[];
|
|
33
|
+
promptContext: string;
|
|
34
|
+
}>;
|
|
35
|
+
//# sourceMappingURL=attachment-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-types.d.ts","sourceRoot":"","sources":["../../src/context/attachment-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,uBAAuB,GAC/B,WAAW,GACX,WAAW,GACX,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,WAAW,CAAC;AAEhB;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,QAAQ,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,uBAAuB,CAAC;KACjC,CAAC,CAAC;IACH,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC/C,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author Bùi Trọng Hiếu
|
|
3
|
+
* @email kevinbui210191@gmail.com
|
|
4
|
+
* @create date 2026-08-21
|
|
5
|
+
* @modify date 2026-08-21
|
|
6
|
+
* @desc Chat attachment shape consumed by ContextManager, TokenLedger, and PromptAssembler.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=attachment-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-types.js","sourceRoot":"","sources":["../../src/context/attachment-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable, provider-neutral checkpoint used by compaction, pause and crash
|
|
3
|
+
* recovery. Raw model thinking and raw tool output are intentionally absent.
|
|
4
|
+
*/
|
|
5
|
+
export declare const AI_CODER_CHECKPOINT_SCHEMA_VERSION: 1;
|
|
6
|
+
export declare const AI_CODER_WORKSPACE_ENTRY_KINDS: readonly ["directory", "file", "missing", "other", "symlink"];
|
|
7
|
+
export type AiCoderWorkspaceEntryKind = typeof AI_CODER_WORKSPACE_ENTRY_KINDS[number];
|
|
8
|
+
export declare function isAiCoderWorkspaceEntryKind(value: unknown): value is AiCoderWorkspaceEntryKind;
|
|
9
|
+
/**
|
|
10
|
+
* Accepts legacy file-only mutations without kinds and the v1-compatible
|
|
11
|
+
* extended form used for directories, symlinks, and special entries.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isAiCoderWorkspaceMutationEvidence(value: Readonly<{
|
|
14
|
+
afterHash: string | null;
|
|
15
|
+
afterKind?: AiCoderWorkspaceEntryKind;
|
|
16
|
+
beforeHash: string | null;
|
|
17
|
+
beforeKind?: AiCoderWorkspaceEntryKind;
|
|
18
|
+
}>): boolean;
|
|
19
|
+
export type AiCoderCheckpointReason = "app_shutdown" | "context_threshold" | "failure" | "manual" | "milestone" | "pause" | "provider_overflow" | "tool_result_pressure" | "tool_round_limit";
|
|
20
|
+
export type AiCoderCheckpointPhase = "preparing" | "inspecting" | "planning" | "executing" | "validating" | "reviewing";
|
|
21
|
+
export type AiCoderCheckpointFile = Readonly<{
|
|
22
|
+
contentHash: string | null;
|
|
23
|
+
endLine?: number;
|
|
24
|
+
kind?: AiCoderWorkspaceEntryKind;
|
|
25
|
+
path: string;
|
|
26
|
+
reason?: string;
|
|
27
|
+
startLine?: number;
|
|
28
|
+
}>;
|
|
29
|
+
export type AiCoderCheckpointEdit = Readonly<{
|
|
30
|
+
afterHash: string | null;
|
|
31
|
+
afterKind?: AiCoderWorkspaceEntryKind;
|
|
32
|
+
beforeHash: string | null;
|
|
33
|
+
beforeKind?: AiCoderWorkspaceEntryKind;
|
|
34
|
+
path: string;
|
|
35
|
+
sequence: number;
|
|
36
|
+
toolCallId: string;
|
|
37
|
+
workspaceFingerprint: string;
|
|
38
|
+
}>;
|
|
39
|
+
export type AiCoderCheckpointValidation = Readonly<{
|
|
40
|
+
command?: string;
|
|
41
|
+
detail: string;
|
|
42
|
+
id: string;
|
|
43
|
+
paths?: readonly string[];
|
|
44
|
+
scope: "paths" | "workspace";
|
|
45
|
+
sequence: number;
|
|
46
|
+
status: "failed" | "not_run" | "passed";
|
|
47
|
+
workspaceFingerprint: string;
|
|
48
|
+
}>;
|
|
49
|
+
export type AiCoderCheckpointToolCall = Readonly<{
|
|
50
|
+
argumentsHash: string;
|
|
51
|
+
idempotencyKey?: string;
|
|
52
|
+
name: string;
|
|
53
|
+
outcome: "canceled" | "failed" | "succeeded" | "unknown";
|
|
54
|
+
toolCallId: string;
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Bounded, host-attested external evidence that survives compaction. The
|
|
58
|
+
* summary remains untrusted source data even though the surrounding
|
|
59
|
+
* checkpoint structure and provenance are verified by the host.
|
|
60
|
+
*/
|
|
61
|
+
export type AiCoderCheckpointResearchSource = Readonly<{
|
|
62
|
+
contentHash: string | null;
|
|
63
|
+
kind: "fetch" | "search";
|
|
64
|
+
sequence: number;
|
|
65
|
+
summary: string;
|
|
66
|
+
title?: string;
|
|
67
|
+
toolCallId: string;
|
|
68
|
+
truncated: boolean;
|
|
69
|
+
url: string;
|
|
70
|
+
}>;
|
|
71
|
+
export type AiCoderCheckpointCompatibility = Readonly<{
|
|
72
|
+
activeToolNames: readonly string[];
|
|
73
|
+
capabilitiesHash: string;
|
|
74
|
+
effectCapabilitiesHash: string;
|
|
75
|
+
modelIdentity: string;
|
|
76
|
+
promptHash: string;
|
|
77
|
+
promptVersion: string;
|
|
78
|
+
registrySnapshotHash: string;
|
|
79
|
+
systemPromptHash: string;
|
|
80
|
+
taskContractHash: string;
|
|
81
|
+
}>;
|
|
82
|
+
export type AiCoderCheckpointAcceptanceCriterion = Readonly<{
|
|
83
|
+
evidenceIds: readonly string[];
|
|
84
|
+
id: string;
|
|
85
|
+
required: boolean;
|
|
86
|
+
status: "pending" | "satisfied" | "waived";
|
|
87
|
+
text: string;
|
|
88
|
+
}>;
|
|
89
|
+
export type AiCoderCheckpointNoProgress = Readonly<{
|
|
90
|
+
episodes: number;
|
|
91
|
+
failedToolFamilies: readonly Readonly<{
|
|
92
|
+
count: number;
|
|
93
|
+
key: string;
|
|
94
|
+
}>[];
|
|
95
|
+
hostStateVersions?: readonly Readonly<{
|
|
96
|
+
key: string;
|
|
97
|
+
value: string;
|
|
98
|
+
}>[];
|
|
99
|
+
observationFamilies?: readonly Readonly<{
|
|
100
|
+
count: number;
|
|
101
|
+
key: string;
|
|
102
|
+
}>[];
|
|
103
|
+
previousTool: Readonly<{
|
|
104
|
+
argumentsHash: string;
|
|
105
|
+
name: string;
|
|
106
|
+
repetitions: number;
|
|
107
|
+
}> | null;
|
|
108
|
+
/** Bounded suffix used to continue alternating-cycle detection after resume. */
|
|
109
|
+
toolCycleSuffix?: readonly Readonly<{
|
|
110
|
+
argumentsHash: string;
|
|
111
|
+
name: string;
|
|
112
|
+
}>[];
|
|
113
|
+
}>;
|
|
114
|
+
export type AiCoderRunCheckpointPayload = Readonly<{
|
|
115
|
+
acceptanceCriteria: readonly AiCoderCheckpointAcceptanceCriterion[];
|
|
116
|
+
approvals: readonly string[];
|
|
117
|
+
compatibility: AiCoderCheckpointCompatibility;
|
|
118
|
+
completionEvidence: Readonly<{
|
|
119
|
+
diffReview: Readonly<{
|
|
120
|
+
diffHash: string;
|
|
121
|
+
sequence: number;
|
|
122
|
+
workspaceFingerprint: string;
|
|
123
|
+
}> | null;
|
|
124
|
+
}>;
|
|
125
|
+
constraints: readonly string[];
|
|
126
|
+
decisions: readonly string[];
|
|
127
|
+
delivery: Readonly<{
|
|
128
|
+
attachmentsDelivered: boolean;
|
|
129
|
+
}>;
|
|
130
|
+
edits: readonly AiCoderCheckpointEdit[];
|
|
131
|
+
executionBudget: Readonly<{
|
|
132
|
+
deadlinePolicy: "per_execution_segment";
|
|
133
|
+
persistenceGraceMs: number;
|
|
134
|
+
segmentDeadlineMs: number;
|
|
135
|
+
}>;
|
|
136
|
+
goal: string;
|
|
137
|
+
lastToolCalls: readonly AiCoderCheckpointToolCall[];
|
|
138
|
+
nextAction: string;
|
|
139
|
+
noProgress?: AiCoderCheckpointNoProgress;
|
|
140
|
+
openProblems: readonly string[];
|
|
141
|
+
pendingApprovals: readonly Readonly<{
|
|
142
|
+
requestId: string;
|
|
143
|
+
returnPhase: AiCoderCheckpointPhase;
|
|
144
|
+
toolCallId: string;
|
|
145
|
+
toolName: string;
|
|
146
|
+
}>[];
|
|
147
|
+
phase: AiCoderCheckpointPhase;
|
|
148
|
+
plan: Readonly<{
|
|
149
|
+
completed: readonly string[];
|
|
150
|
+
inProgress: string | null;
|
|
151
|
+
pending: readonly string[];
|
|
152
|
+
}>;
|
|
153
|
+
researchSources?: readonly AiCoderCheckpointResearchSource[];
|
|
154
|
+
runId: string;
|
|
155
|
+
schemaVersion: typeof AI_CODER_CHECKPOINT_SCHEMA_VERSION;
|
|
156
|
+
seenToolCallIds: readonly string[];
|
|
157
|
+
taskId: string;
|
|
158
|
+
tokenLedgerRef: string;
|
|
159
|
+
totals: Readonly<{
|
|
160
|
+
compactionCount: number;
|
|
161
|
+
modelTurns: number;
|
|
162
|
+
toolCalls: number;
|
|
163
|
+
}>;
|
|
164
|
+
validation: readonly AiCoderCheckpointValidation[];
|
|
165
|
+
workspace: Readonly<{
|
|
166
|
+
activeFiles: readonly AiCoderCheckpointFile[];
|
|
167
|
+
dirtyStateSummary: string | null;
|
|
168
|
+
instructions: readonly string[];
|
|
169
|
+
root: string | null;
|
|
170
|
+
stateFingerprint: string | null;
|
|
171
|
+
}>;
|
|
172
|
+
}>;
|
|
173
|
+
export type AiCoderRunCheckpoint = AiCoderRunCheckpointPayload & Readonly<{
|
|
174
|
+
contentHash: string;
|
|
175
|
+
createdAt: string;
|
|
176
|
+
reason: AiCoderCheckpointReason;
|
|
177
|
+
}>;
|
|
178
|
+
export type AiCoderCheckpointValidationIssue = Readonly<{
|
|
179
|
+
code: "HASH_MISMATCH" | "INVALID_FIELD" | "UNSUPPORTED_SCHEMA";
|
|
180
|
+
message: string;
|
|
181
|
+
path: string;
|
|
182
|
+
}>;
|
|
183
|
+
export declare class AiCoderCheckpointIntegrityError extends Error {
|
|
184
|
+
constructor(message: string);
|
|
185
|
+
}
|
|
186
|
+
/** Portable SHA-256 over the deterministic canonical JSON representation. */
|
|
187
|
+
export declare function hashAiCoderCanonicalValue(value: unknown): Promise<string>;
|
|
188
|
+
export declare function redactAiCoderCheckpointText(value: string): string;
|
|
189
|
+
export declare function sanitizeAiCoderCheckpointPayload(payload: AiCoderRunCheckpointPayload): AiCoderRunCheckpointPayload;
|
|
190
|
+
export declare function createAiCoderRunCheckpoint(payload: AiCoderRunCheckpointPayload, reason: AiCoderCheckpointReason, now?: () => string): Promise<AiCoderRunCheckpoint>;
|
|
191
|
+
export declare function validateAiCoderRunCheckpoint(value: unknown): Promise<readonly AiCoderCheckpointValidationIssue[]>;
|
|
192
|
+
export declare function assertAiCoderRunCheckpoint(value: unknown): Promise<AiCoderRunCheckpoint>;
|
|
193
|
+
export declare function formatAiCoderCheckpointMessage(checkpoint: AiCoderRunCheckpoint): string;
|
|
194
|
+
//# sourceMappingURL=checkpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/context/checkpoint.ts"],"names":[],"mappings":"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"}
|