@det-acp/core 0.2.0 → 0.3.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/README.md +332 -213
- package/dist/engine/action-registry.d.ts.map +1 -1
- package/dist/engine/action-registry.js +20 -0
- package/dist/engine/action-registry.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/archive-extract.d.ts +45 -0
- package/dist/tools/archive-extract.d.ts.map +1 -0
- package/dist/tools/archive-extract.js +246 -0
- package/dist/tools/archive-extract.js.map +1 -0
- package/dist/tools/directory-create.d.ts +33 -0
- package/dist/tools/directory-create.d.ts.map +1 -0
- package/dist/tools/directory-create.js +145 -0
- package/dist/tools/directory-create.js.map +1 -0
- package/dist/tools/directory-list.d.ts +32 -0
- package/dist/tools/directory-list.d.ts.map +1 -0
- package/dist/tools/directory-list.js +114 -0
- package/dist/tools/directory-list.js.map +1 -0
- package/dist/tools/env-read.d.ts +31 -0
- package/dist/tools/env-read.d.ts.map +1 -0
- package/dist/tools/env-read.js +108 -0
- package/dist/tools/env-read.js.map +1 -0
- package/dist/tools/file-copy.d.ts +30 -0
- package/dist/tools/file-copy.d.ts.map +1 -0
- package/dist/tools/file-copy.js +170 -0
- package/dist/tools/file-copy.js.map +1 -0
- package/dist/tools/file-delete.d.ts +27 -0
- package/dist/tools/file-delete.d.ts.map +1 -0
- package/dist/tools/file-delete.js +143 -0
- package/dist/tools/file-delete.js.map +1 -0
- package/dist/tools/file-move.d.ts +30 -0
- package/dist/tools/file-move.d.ts.map +1 -0
- package/dist/tools/file-move.js +167 -0
- package/dist/tools/file-move.js.map +1 -0
- package/dist/tools/git-commit.d.ts +33 -0
- package/dist/tools/git-commit.d.ts.map +1 -0
- package/dist/tools/git-commit.js +176 -0
- package/dist/tools/git-commit.js.map +1 -0
- package/dist/tools/git-status.d.ts +29 -0
- package/dist/tools/git-status.d.ts.map +1 -0
- package/dist/tools/git-status.js +159 -0
- package/dist/tools/git-status.js.map +1 -0
- package/dist/tools/network-dns.d.ts +50 -0
- package/dist/tools/network-dns.d.ts.map +1 -0
- package/dist/tools/network-dns.js +122 -0
- package/dist/tools/network-dns.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/examples/coding-agent.policy.yaml +44 -0
- package/examples/data-analyst.policy.yaml +160 -0
- package/examples/devops-deploy.policy.yaml +68 -0
- package/examples/infrastructure-manager.policy.yaml +209 -0
- package/examples/security-audit.policy.yaml +152 -0
- package/examples/video-upscaler.policy.yaml +45 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/engine/action-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG3E,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAkC;IAElD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAOpC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAcxE;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAQtC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,cAAc;CAKvC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/engine/action-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG3E,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAkC;IAElD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAOpC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAcxE;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAQtC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,cAAc;CAKvC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,cAAc,CAAC,CAoCrE"}
|
|
@@ -80,16 +80,36 @@ export class ActionRegistry {
|
|
|
80
80
|
export async function createDefaultRegistry() {
|
|
81
81
|
const { FileReadAdapter } = await import('../tools/file-read.js');
|
|
82
82
|
const { FileWriteAdapter } = await import('../tools/file-write.js');
|
|
83
|
+
const { FileDeleteAdapter } = await import('../tools/file-delete.js');
|
|
84
|
+
const { FileMoveAdapter } = await import('../tools/file-move.js');
|
|
85
|
+
const { FileCopyAdapter } = await import('../tools/file-copy.js');
|
|
86
|
+
const { DirectoryListAdapter } = await import('../tools/directory-list.js');
|
|
87
|
+
const { DirectoryCreateAdapter } = await import('../tools/directory-create.js');
|
|
83
88
|
const { CommandRunAdapter } = await import('../tools/command-run.js');
|
|
84
89
|
const { HttpRequestAdapter } = await import('../tools/http-request.js');
|
|
85
90
|
const { GitDiffAdapter, GitApplyAdapter } = await import('../tools/git.js');
|
|
91
|
+
const { GitCommitAdapter } = await import('../tools/git-commit.js');
|
|
92
|
+
const { GitStatusAdapter } = await import('../tools/git-status.js');
|
|
93
|
+
const { EnvReadAdapter } = await import('../tools/env-read.js');
|
|
94
|
+
const { NetworkDnsAdapter } = await import('../tools/network-dns.js');
|
|
95
|
+
const { ArchiveExtractAdapter } = await import('../tools/archive-extract.js');
|
|
86
96
|
const registry = new ActionRegistry();
|
|
87
97
|
registry.register(new FileReadAdapter());
|
|
88
98
|
registry.register(new FileWriteAdapter());
|
|
99
|
+
registry.register(new FileDeleteAdapter());
|
|
100
|
+
registry.register(new FileMoveAdapter());
|
|
101
|
+
registry.register(new FileCopyAdapter());
|
|
102
|
+
registry.register(new DirectoryListAdapter());
|
|
103
|
+
registry.register(new DirectoryCreateAdapter());
|
|
89
104
|
registry.register(new CommandRunAdapter());
|
|
90
105
|
registry.register(new HttpRequestAdapter());
|
|
91
106
|
registry.register(new GitDiffAdapter());
|
|
92
107
|
registry.register(new GitApplyAdapter());
|
|
108
|
+
registry.register(new GitCommitAdapter());
|
|
109
|
+
registry.register(new GitStatusAdapter());
|
|
110
|
+
registry.register(new EnvReadAdapter());
|
|
111
|
+
registry.register(new NetworkDnsAdapter());
|
|
112
|
+
registry.register(new ArchiveExtractAdapter());
|
|
93
113
|
return registry;
|
|
94
114
|
}
|
|
95
115
|
//# sourceMappingURL=action-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/engine/action-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAElD;;OAEG;IACH,QAAQ,CAAC,OAAoB;QAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,OAAsB,EAAE,MAAc;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,CAAC,kBAAkB,OAAO,CAAC,IAAI,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;aAC1F,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,oCAAoC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3G,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QAClB,sCAAsC;QACtC,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAClE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACpE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACtE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IACxE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/engine/action-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```typescript
|
|
8
|
-
* import { AgentGateway } from '
|
|
8
|
+
* import { AgentGateway } from '@det-acp/core';
|
|
9
9
|
*
|
|
10
10
|
* const gateway = await AgentGateway.create({ ledgerDir: './ledgers' });
|
|
11
11
|
* const session = await gateway.createSession('./policy.yaml');
|
|
@@ -32,9 +32,19 @@ export { evaluateAction, evaluateSessionAction, assessRiskLevel } from './policy
|
|
|
32
32
|
export { ToolAdapter } from './tools/base.js';
|
|
33
33
|
export { FileReadAdapter } from './tools/file-read.js';
|
|
34
34
|
export { FileWriteAdapter } from './tools/file-write.js';
|
|
35
|
+
export { FileDeleteAdapter } from './tools/file-delete.js';
|
|
36
|
+
export { FileMoveAdapter } from './tools/file-move.js';
|
|
37
|
+
export { FileCopyAdapter } from './tools/file-copy.js';
|
|
38
|
+
export { DirectoryListAdapter } from './tools/directory-list.js';
|
|
39
|
+
export { DirectoryCreateAdapter } from './tools/directory-create.js';
|
|
35
40
|
export { CommandRunAdapter } from './tools/command-run.js';
|
|
36
41
|
export { HttpRequestAdapter } from './tools/http-request.js';
|
|
37
42
|
export { GitDiffAdapter, GitApplyAdapter } from './tools/git.js';
|
|
43
|
+
export { GitCommitAdapter } from './tools/git-commit.js';
|
|
44
|
+
export { GitStatusAdapter } from './tools/git-status.js';
|
|
45
|
+
export { EnvReadAdapter } from './tools/env-read.js';
|
|
46
|
+
export { NetworkDnsAdapter } from './tools/network-dns.js';
|
|
47
|
+
export { ArchiveExtractAdapter } from './tools/archive-extract.js';
|
|
38
48
|
export { ActionRegistry, createDefaultRegistry } from './engine/action-registry.js';
|
|
39
49
|
export { GateManager, createAutoApproveHandler } from './engine/gate.js';
|
|
40
50
|
export { RollbackManager } from './rollback/manager.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhF,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhF,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGpF,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAGzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAGxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlF,YAAY,EAEV,MAAM,EACN,UAAU,EACV,eAAe,EACf,IAAI,EACJ,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,SAAS,EAET,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,YAAY,EAEZ,OAAO,EACP,YAAY,EACZ,aAAa,EACb,aAAa,EAEb,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EAEd,gBAAgB,EAChB,aAAa,EAEb,WAAW,EACX,eAAe,EAEf,WAAW,EACX,YAAY,EACZ,YAAY,EAEZ,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```typescript
|
|
8
|
-
* import { AgentGateway } from '
|
|
8
|
+
* import { AgentGateway } from '@det-acp/core';
|
|
9
9
|
*
|
|
10
10
|
* const gateway = await AgentGateway.create({ ledgerDir: './ledgers' });
|
|
11
11
|
* const session = await gateway.createSession('./policy.yaml');
|
|
@@ -36,9 +36,19 @@ export { evaluateAction, evaluateSessionAction, assessRiskLevel } from './policy
|
|
|
36
36
|
export { ToolAdapter } from './tools/base.js';
|
|
37
37
|
export { FileReadAdapter } from './tools/file-read.js';
|
|
38
38
|
export { FileWriteAdapter } from './tools/file-write.js';
|
|
39
|
+
export { FileDeleteAdapter } from './tools/file-delete.js';
|
|
40
|
+
export { FileMoveAdapter } from './tools/file-move.js';
|
|
41
|
+
export { FileCopyAdapter } from './tools/file-copy.js';
|
|
42
|
+
export { DirectoryListAdapter } from './tools/directory-list.js';
|
|
43
|
+
export { DirectoryCreateAdapter } from './tools/directory-create.js';
|
|
39
44
|
export { CommandRunAdapter } from './tools/command-run.js';
|
|
40
45
|
export { HttpRequestAdapter } from './tools/http-request.js';
|
|
41
46
|
export { GitDiffAdapter, GitApplyAdapter } from './tools/git.js';
|
|
47
|
+
export { GitCommitAdapter } from './tools/git-commit.js';
|
|
48
|
+
export { GitStatusAdapter } from './tools/git-status.js';
|
|
49
|
+
export { EnvReadAdapter } from './tools/env-read.js';
|
|
50
|
+
export { NetworkDnsAdapter } from './tools/network-dns.js';
|
|
51
|
+
export { ArchiveExtractAdapter } from './tools/archive-extract.js';
|
|
42
52
|
// Action registry
|
|
43
53
|
export { ActionRegistry, createDefaultRegistry } from './engine/action-registry.js';
|
|
44
54
|
// Gate management
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAEvE,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAA6B,MAAM,qBAAqB,CAAC;AAEhF,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE/F,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAEvE,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAA6B,MAAM,qBAAqB,CAAC;AAEhF,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE/F,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAEzE,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAExE,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,WAAW,EAAqB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* archive:extract — Scoped archive extraction tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Extracts tar and zip archives within allowed path scopes.
|
|
5
|
+
* Both source archive and destination must be within policy scope.
|
|
6
|
+
* Rollback support: removes extracted files.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { ToolAdapter } from './base.js';
|
|
10
|
+
import type { DryRunResult, ExecutionContext, ExecutionResult, Policy, RollbackResult, ValidationResult } from '../types.js';
|
|
11
|
+
export declare const ArchiveExtractInputSchema: z.ZodObject<{
|
|
12
|
+
archive: z.ZodString;
|
|
13
|
+
destination: z.ZodString;
|
|
14
|
+
format: z.ZodOptional<z.ZodEnum<{
|
|
15
|
+
tar: "tar";
|
|
16
|
+
"tar.gz": "tar.gz";
|
|
17
|
+
"tar.bz2": "tar.bz2";
|
|
18
|
+
zip: "zip";
|
|
19
|
+
}>>;
|
|
20
|
+
timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type ArchiveExtractInput = z.infer<typeof ArchiveExtractInputSchema>;
|
|
23
|
+
export declare class ArchiveExtractAdapter extends ToolAdapter {
|
|
24
|
+
readonly name = "archive:extract";
|
|
25
|
+
readonly description = "Extract tar/zip archives within allowed path scopes";
|
|
26
|
+
readonly inputSchema: z.ZodObject<{
|
|
27
|
+
archive: z.ZodString;
|
|
28
|
+
destination: z.ZodString;
|
|
29
|
+
format: z.ZodOptional<z.ZodEnum<{
|
|
30
|
+
tar: "tar";
|
|
31
|
+
"tar.gz": "tar.gz";
|
|
32
|
+
"tar.bz2": "tar.bz2";
|
|
33
|
+
zip: "zip";
|
|
34
|
+
}>>;
|
|
35
|
+
timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
validate(input: unknown, policy: Policy): ValidationResult;
|
|
38
|
+
dryRun(input: Record<string, unknown>, _ctx: ExecutionContext): Promise<DryRunResult>;
|
|
39
|
+
execute(input: Record<string, unknown>, ctx: ExecutionContext): Promise<ExecutionResult>;
|
|
40
|
+
rollback(input: Record<string, unknown>, ctx: ExecutionContext): Promise<RollbackResult>;
|
|
41
|
+
private detectFormat;
|
|
42
|
+
private buildExtractCommand;
|
|
43
|
+
private listFilesRecursive;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=archive-extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-extract.d.ts","sourceRoot":"","sources":["../../src/tools/archive-extract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEf,MAAM,EACN,cAAc,EACd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,yBAAyB;;;;;;;;;;iBASpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,WAAW,yDAAyD;IAC7E,QAAQ,CAAC,WAAW;;;;;;;;;;sBAA6B;IAEjD,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAyCpD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BrF,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkFxF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAgE9F,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,kBAAkB;CAmB3B"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* archive:extract — Scoped archive extraction tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Extracts tar and zip archives within allowed path scopes.
|
|
5
|
+
* Both source archive and destination must be within policy scope.
|
|
6
|
+
* Rollback support: removes extracted files.
|
|
7
|
+
*/
|
|
8
|
+
import { execSync } from 'node:child_process';
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import crypto from 'node:crypto';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import { ToolAdapter } from './base.js';
|
|
14
|
+
import { evaluateAction } from '../policy/evaluator.js';
|
|
15
|
+
export const ArchiveExtractInputSchema = z.object({
|
|
16
|
+
/** Path to the archive file */
|
|
17
|
+
archive: z.string().min(1, 'Archive path is required'),
|
|
18
|
+
/** Destination directory for extraction */
|
|
19
|
+
destination: z.string().min(1, 'Destination path is required'),
|
|
20
|
+
/** Archive format (auto-detected from extension if not specified) */
|
|
21
|
+
format: z.enum(['tar', 'tar.gz', 'tar.bz2', 'zip']).optional(),
|
|
22
|
+
/** Timeout in milliseconds */
|
|
23
|
+
timeout: z.number().positive().optional().default(60000),
|
|
24
|
+
});
|
|
25
|
+
export class ArchiveExtractAdapter extends ToolAdapter {
|
|
26
|
+
name = 'archive:extract';
|
|
27
|
+
description = 'Extract tar/zip archives within allowed path scopes';
|
|
28
|
+
inputSchema = ArchiveExtractInputSchema;
|
|
29
|
+
validate(input, policy) {
|
|
30
|
+
const parsed = ArchiveExtractInputSchema.safeParse(input);
|
|
31
|
+
if (!parsed.success) {
|
|
32
|
+
return {
|
|
33
|
+
verdict: 'deny',
|
|
34
|
+
tool: this.name,
|
|
35
|
+
reasons: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Validate both archive (read) and destination (write) paths
|
|
39
|
+
const archiveResult = evaluateAction({ tool: this.name, input: { ...parsed.data, path: parsed.data.archive } }, policy);
|
|
40
|
+
if (archiveResult.verdict === 'deny') {
|
|
41
|
+
return {
|
|
42
|
+
...archiveResult,
|
|
43
|
+
reasons: archiveResult.reasons.map((r) => `Archive: ${r}`),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const destResult = evaluateAction({ tool: this.name, input: { ...parsed.data, path: parsed.data.destination } }, policy);
|
|
47
|
+
if (destResult.verdict === 'deny') {
|
|
48
|
+
return {
|
|
49
|
+
...destResult,
|
|
50
|
+
reasons: destResult.reasons.map((r) => `Destination: ${r}`),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Return the more restrictive result
|
|
54
|
+
if (archiveResult.verdict === 'gate' || destResult.verdict === 'gate') {
|
|
55
|
+
return archiveResult.verdict === 'gate' ? archiveResult : destResult;
|
|
56
|
+
}
|
|
57
|
+
return archiveResult;
|
|
58
|
+
}
|
|
59
|
+
async dryRun(input, _ctx) {
|
|
60
|
+
const { archive, destination, format } = input;
|
|
61
|
+
const absArchive = path.resolve(archive);
|
|
62
|
+
const absDest = path.resolve(destination);
|
|
63
|
+
const warnings = [];
|
|
64
|
+
if (!fs.existsSync(absArchive)) {
|
|
65
|
+
warnings.push(`Archive does not exist: ${absArchive}`);
|
|
66
|
+
}
|
|
67
|
+
if (!fs.existsSync(absDest)) {
|
|
68
|
+
warnings.push(`Destination directory does not exist: ${absDest}`);
|
|
69
|
+
}
|
|
70
|
+
const detectedFormat = format ?? this.detectFormat(absArchive);
|
|
71
|
+
if (!detectedFormat) {
|
|
72
|
+
warnings.push(`Cannot detect archive format from extension: ${absArchive}`);
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
tool: this.name,
|
|
76
|
+
wouldDo: `Extract ${absArchive} → ${absDest} (format: ${detectedFormat ?? 'unknown'})`,
|
|
77
|
+
estimatedChanges: [absDest],
|
|
78
|
+
warnings,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async execute(input, ctx) {
|
|
82
|
+
const start = Date.now();
|
|
83
|
+
const { archive, destination, format, timeout } = input;
|
|
84
|
+
const absArchive = path.resolve(archive);
|
|
85
|
+
const absDest = path.resolve(destination);
|
|
86
|
+
const artifacts = [];
|
|
87
|
+
try {
|
|
88
|
+
if (!fs.existsSync(absArchive)) {
|
|
89
|
+
return this.failure(`Archive does not exist: ${absArchive}`, Date.now() - start);
|
|
90
|
+
}
|
|
91
|
+
if (!fs.existsSync(absDest)) {
|
|
92
|
+
return this.failure(`Destination directory does not exist: ${absDest}`, Date.now() - start);
|
|
93
|
+
}
|
|
94
|
+
// Detect format
|
|
95
|
+
const archiveFormat = format ?? this.detectFormat(absArchive);
|
|
96
|
+
if (!archiveFormat) {
|
|
97
|
+
return this.failure(`Cannot detect archive format from extension: ${absArchive}`, Date.now() - start);
|
|
98
|
+
}
|
|
99
|
+
// List files before extraction to track what's new
|
|
100
|
+
const filesBefore = new Set(this.listFilesRecursive(absDest));
|
|
101
|
+
// Compute archive checksum
|
|
102
|
+
const archiveContent = fs.readFileSync(absArchive);
|
|
103
|
+
const archiveChecksum = crypto.createHash('sha256').update(archiveContent).digest('hex');
|
|
104
|
+
artifacts.push({
|
|
105
|
+
type: 'checksum',
|
|
106
|
+
value: `sha256:${archiveChecksum}`,
|
|
107
|
+
description: `Archive checksum: ${absArchive}`,
|
|
108
|
+
});
|
|
109
|
+
// Extract
|
|
110
|
+
const cmd = this.buildExtractCommand(archiveFormat, absArchive, absDest);
|
|
111
|
+
const output = execSync(cmd, {
|
|
112
|
+
cwd: absDest,
|
|
113
|
+
encoding: 'utf-8',
|
|
114
|
+
timeout,
|
|
115
|
+
});
|
|
116
|
+
// List files after extraction to determine what was extracted
|
|
117
|
+
const filesAfter = this.listFilesRecursive(absDest);
|
|
118
|
+
const extractedFiles = filesAfter.filter((f) => !filesBefore.has(f));
|
|
119
|
+
artifacts.push({
|
|
120
|
+
type: 'log',
|
|
121
|
+
value: `Extracted ${extractedFiles.length} files from ${absArchive} to ${absDest}`,
|
|
122
|
+
description: 'Extraction summary',
|
|
123
|
+
});
|
|
124
|
+
// Store rollback data
|
|
125
|
+
const rollbackKey = `archive:extract:${absArchive}:${absDest}`;
|
|
126
|
+
ctx.rollbackData[rollbackKey] = {
|
|
127
|
+
archive: absArchive,
|
|
128
|
+
destination: absDest,
|
|
129
|
+
extractedFiles,
|
|
130
|
+
};
|
|
131
|
+
ctx.budget.filesChanged += extractedFiles.length;
|
|
132
|
+
return this.success({
|
|
133
|
+
archive: absArchive,
|
|
134
|
+
destination: absDest,
|
|
135
|
+
format: archiveFormat,
|
|
136
|
+
filesExtracted: extractedFiles.length,
|
|
137
|
+
files: extractedFiles.slice(0, 100), // Limit for large archives
|
|
138
|
+
}, Date.now() - start, artifacts);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return this.failure(err.message, Date.now() - start);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async rollback(input, ctx) {
|
|
145
|
+
const { archive, destination } = input;
|
|
146
|
+
const absArchive = path.resolve(archive);
|
|
147
|
+
const absDest = path.resolve(destination);
|
|
148
|
+
const rollbackKey = `archive:extract:${absArchive}:${absDest}`;
|
|
149
|
+
const rollbackData = ctx.rollbackData[rollbackKey];
|
|
150
|
+
if (!rollbackData) {
|
|
151
|
+
return {
|
|
152
|
+
tool: this.name,
|
|
153
|
+
success: false,
|
|
154
|
+
description: 'No rollback data available',
|
|
155
|
+
error: 'Rollback data not found — execute() may not have been called',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
let removed = 0;
|
|
160
|
+
// Remove extracted files in reverse order
|
|
161
|
+
for (const file of [...rollbackData.extractedFiles].reverse()) {
|
|
162
|
+
try {
|
|
163
|
+
if (fs.existsSync(file)) {
|
|
164
|
+
const stat = fs.statSync(file);
|
|
165
|
+
if (stat.isFile()) {
|
|
166
|
+
fs.unlinkSync(file);
|
|
167
|
+
removed++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Permission denied or file in use
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Try to remove empty directories that were created
|
|
176
|
+
for (const file of [...rollbackData.extractedFiles].reverse()) {
|
|
177
|
+
try {
|
|
178
|
+
const dir = path.dirname(file);
|
|
179
|
+
if (fs.existsSync(dir) && fs.readdirSync(dir).length === 0) {
|
|
180
|
+
fs.rmdirSync(dir);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Not empty or permission denied
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
tool: this.name,
|
|
189
|
+
success: true,
|
|
190
|
+
description: `Removed ${removed} extracted files from ${rollbackData.destination}`,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
return {
|
|
195
|
+
tool: this.name,
|
|
196
|
+
success: false,
|
|
197
|
+
description: `Failed to rollback archive extraction`,
|
|
198
|
+
error: err.message,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
detectFormat(archivePath) {
|
|
203
|
+
const lower = archivePath.toLowerCase();
|
|
204
|
+
if (lower.endsWith('.tar.gz') || lower.endsWith('.tgz'))
|
|
205
|
+
return 'tar.gz';
|
|
206
|
+
if (lower.endsWith('.tar.bz2') || lower.endsWith('.tbz2'))
|
|
207
|
+
return 'tar.bz2';
|
|
208
|
+
if (lower.endsWith('.tar'))
|
|
209
|
+
return 'tar';
|
|
210
|
+
if (lower.endsWith('.zip'))
|
|
211
|
+
return 'zip';
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
buildExtractCommand(format, archivePath, destDir) {
|
|
215
|
+
switch (format) {
|
|
216
|
+
case 'tar':
|
|
217
|
+
return `tar xf "${archivePath}" -C "${destDir}"`;
|
|
218
|
+
case 'tar.gz':
|
|
219
|
+
return `tar xzf "${archivePath}" -C "${destDir}"`;
|
|
220
|
+
case 'tar.bz2':
|
|
221
|
+
return `tar xjf "${archivePath}" -C "${destDir}"`;
|
|
222
|
+
case 'zip':
|
|
223
|
+
return `unzip -o "${archivePath}" -d "${destDir}"`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
listFilesRecursive(dirPath) {
|
|
227
|
+
const files = [];
|
|
228
|
+
try {
|
|
229
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
230
|
+
for (const entry of entries) {
|
|
231
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
232
|
+
if (entry.isDirectory()) {
|
|
233
|
+
files.push(...this.listFilesRecursive(fullPath));
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
files.push(fullPath);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Permission denied
|
|
242
|
+
}
|
|
243
|
+
return files;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=archive-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-extract.js","sourceRoot":"","sources":["../../src/tools/archive-extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* directory:create — Scoped directory creation tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Creates directories within allowed path scopes.
|
|
5
|
+
* Supports recursive creation (mkdir -p).
|
|
6
|
+
* Rollback support: removes created directories.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { ToolAdapter } from './base.js';
|
|
10
|
+
import type { DryRunResult, ExecutionContext, ExecutionResult, Policy, RollbackResult, ValidationResult } from '../types.js';
|
|
11
|
+
export declare const DirectoryCreateInputSchema: z.ZodObject<{
|
|
12
|
+
path: z.ZodString;
|
|
13
|
+
recursive: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export type DirectoryCreateInput = z.infer<typeof DirectoryCreateInputSchema>;
|
|
16
|
+
export declare class DirectoryCreateAdapter extends ToolAdapter {
|
|
17
|
+
readonly name = "directory:create";
|
|
18
|
+
readonly description = "Create a directory within allowed path scopes";
|
|
19
|
+
readonly inputSchema: z.ZodObject<{
|
|
20
|
+
path: z.ZodString;
|
|
21
|
+
recursive: z.ZodDefault<z.ZodBoolean>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
validate(input: unknown, policy: Policy): ValidationResult;
|
|
24
|
+
dryRun(input: Record<string, unknown>, _ctx: ExecutionContext): Promise<DryRunResult>;
|
|
25
|
+
execute(input: Record<string, unknown>, ctx: ExecutionContext): Promise<ExecutionResult>;
|
|
26
|
+
rollback(input: Record<string, unknown>, ctx: ExecutionContext): Promise<RollbackResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Walk up from the target path and find which directories don't exist yet.
|
|
29
|
+
* Returns them in top-down order (parent first).
|
|
30
|
+
*/
|
|
31
|
+
private findNewDirectories;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=directory-create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-create.d.ts","sourceRoot":"","sources":["../../src/tools/directory-create.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,MAAM,EACN,cAAc,EACd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,0BAA0B;;;iBAIrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,qBAAa,sBAAuB,SAAQ,WAAW;IACrD,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,WAAW,mDAAmD;IACvE,QAAQ,CAAC,WAAW;;;sBAA8B;IAElD,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAgBpD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBrF,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA8CxF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IA8C9F;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAa3B"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* directory:create — Scoped directory creation tool adapter.
|
|
3
|
+
*
|
|
4
|
+
* Creates directories within allowed path scopes.
|
|
5
|
+
* Supports recursive creation (mkdir -p).
|
|
6
|
+
* Rollback support: removes created directories.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { ToolAdapter } from './base.js';
|
|
12
|
+
import { evaluateAction } from '../policy/evaluator.js';
|
|
13
|
+
export const DirectoryCreateInputSchema = z.object({
|
|
14
|
+
path: z.string().min(1, 'Directory path is required'),
|
|
15
|
+
/** Create parent directories if they do not exist (like mkdir -p) */
|
|
16
|
+
recursive: z.boolean().default(true),
|
|
17
|
+
});
|
|
18
|
+
export class DirectoryCreateAdapter extends ToolAdapter {
|
|
19
|
+
name = 'directory:create';
|
|
20
|
+
description = 'Create a directory within allowed path scopes';
|
|
21
|
+
inputSchema = DirectoryCreateInputSchema;
|
|
22
|
+
validate(input, policy) {
|
|
23
|
+
const parsed = DirectoryCreateInputSchema.safeParse(input);
|
|
24
|
+
if (!parsed.success) {
|
|
25
|
+
return {
|
|
26
|
+
verdict: 'deny',
|
|
27
|
+
tool: this.name,
|
|
28
|
+
reasons: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return evaluateAction({ tool: this.name, input: parsed.data }, policy);
|
|
32
|
+
}
|
|
33
|
+
async dryRun(input, _ctx) {
|
|
34
|
+
const { path: dirPath, recursive } = input;
|
|
35
|
+
const absPath = path.resolve(dirPath);
|
|
36
|
+
const warnings = [];
|
|
37
|
+
if (fs.existsSync(absPath)) {
|
|
38
|
+
warnings.push(`Directory already exists: ${absPath}`);
|
|
39
|
+
}
|
|
40
|
+
else if (!recursive) {
|
|
41
|
+
const parent = path.dirname(absPath);
|
|
42
|
+
if (!fs.existsSync(parent)) {
|
|
43
|
+
warnings.push(`Parent directory does not exist: ${parent}. Set recursive: true to create.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
tool: this.name,
|
|
48
|
+
wouldDo: `Create directory: ${absPath}${recursive ? ' (recursive)' : ''}`,
|
|
49
|
+
estimatedChanges: [absPath],
|
|
50
|
+
warnings,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async execute(input, ctx) {
|
|
54
|
+
const start = Date.now();
|
|
55
|
+
const { path: dirPath, recursive } = input;
|
|
56
|
+
const absPath = path.resolve(dirPath);
|
|
57
|
+
try {
|
|
58
|
+
if (fs.existsSync(absPath)) {
|
|
59
|
+
const stat = fs.statSync(absPath);
|
|
60
|
+
if (stat.isDirectory()) {
|
|
61
|
+
return this.success({ path: absPath, created: false, reason: 'Directory already exists' }, Date.now() - start);
|
|
62
|
+
}
|
|
63
|
+
return this.failure(`Path exists but is not a directory: ${absPath}`, Date.now() - start);
|
|
64
|
+
}
|
|
65
|
+
// Track what directories are actually created for rollback
|
|
66
|
+
const createdDirs = this.findNewDirectories(absPath);
|
|
67
|
+
// Create the directory
|
|
68
|
+
fs.mkdirSync(absPath, { recursive });
|
|
69
|
+
// Store rollback data: the topmost directory that was actually created
|
|
70
|
+
const rollbackKey = `directory:create:${absPath}`;
|
|
71
|
+
ctx.rollbackData[rollbackKey] = {
|
|
72
|
+
createdDirs,
|
|
73
|
+
path: absPath,
|
|
74
|
+
};
|
|
75
|
+
return this.success({ path: absPath, created: true, createdDirs }, Date.now() - start, [
|
|
76
|
+
{
|
|
77
|
+
type: 'log',
|
|
78
|
+
value: `Created directory: ${absPath} (dirs created: ${createdDirs.length})`,
|
|
79
|
+
description: 'Directory creation record',
|
|
80
|
+
},
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return this.failure(err.message, Date.now() - start);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async rollback(input, ctx) {
|
|
88
|
+
const { path: dirPath } = input;
|
|
89
|
+
const absPath = path.resolve(dirPath);
|
|
90
|
+
const rollbackKey = `directory:create:${absPath}`;
|
|
91
|
+
const rollbackData = ctx.rollbackData[rollbackKey];
|
|
92
|
+
if (!rollbackData) {
|
|
93
|
+
return {
|
|
94
|
+
tool: this.name,
|
|
95
|
+
success: false,
|
|
96
|
+
description: 'No rollback data available',
|
|
97
|
+
error: 'Rollback data not found — execute() may not have been called',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
// Remove created directories in reverse order (deepest first)
|
|
102
|
+
const dirs = [...rollbackData.createdDirs].reverse();
|
|
103
|
+
for (const dir of dirs) {
|
|
104
|
+
if (fs.existsSync(dir)) {
|
|
105
|
+
try {
|
|
106
|
+
fs.rmdirSync(dir);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Directory not empty — skip (may have been used by other operations)
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
tool: this.name,
|
|
115
|
+
success: true,
|
|
116
|
+
description: `Removed created directories: ${dirs.join(', ')}`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return {
|
|
121
|
+
tool: this.name,
|
|
122
|
+
success: false,
|
|
123
|
+
description: `Failed to rollback directory creation`,
|
|
124
|
+
error: err.message,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Walk up from the target path and find which directories don't exist yet.
|
|
130
|
+
* Returns them in top-down order (parent first).
|
|
131
|
+
*/
|
|
132
|
+
findNewDirectories(targetPath) {
|
|
133
|
+
const dirs = [];
|
|
134
|
+
let current = targetPath;
|
|
135
|
+
while (!fs.existsSync(current)) {
|
|
136
|
+
dirs.unshift(current);
|
|
137
|
+
const parent = path.dirname(current);
|
|
138
|
+
if (parent === current)
|
|
139
|
+
break; // Reached filesystem root
|
|
140
|
+
current = parent;
|
|
141
|
+
}
|
|
142
|
+
return dirs;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=directory-create.js.map
|