@gencode/agents 0.0.4 → 0.0.6

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.
Files changed (111) hide show
  1. package/dist/commands/new.js +6 -6
  2. package/dist/commands/new.js.map +1 -1
  3. package/dist/config/types.d.ts +2 -2
  4. package/dist/config/types.d.ts.map +1 -1
  5. package/dist/plugins/hooks.d.ts +20 -1
  6. package/dist/plugins/hooks.d.ts.map +1 -1
  7. package/dist/plugins/hooks.js.map +1 -1
  8. package/dist/plugins/index.d.ts +1 -1
  9. package/dist/plugins/index.d.ts.map +1 -1
  10. package/dist/plugins/index.js.map +1 -1
  11. package/dist/runner/agent-runtime.d.ts +62 -0
  12. package/dist/runner/agent-runtime.d.ts.map +1 -0
  13. package/dist/runner/agent-runtime.js +179 -0
  14. package/dist/runner/agent-runtime.js.map +1 -0
  15. package/dist/runner/announce-loop.d.ts +41 -0
  16. package/dist/runner/announce-loop.d.ts.map +1 -0
  17. package/dist/runner/announce-loop.js +94 -0
  18. package/dist/runner/announce-loop.js.map +1 -0
  19. package/dist/runner/event-dispatcher.d.ts +31 -0
  20. package/dist/runner/event-dispatcher.d.ts.map +1 -0
  21. package/dist/runner/event-dispatcher.js +87 -0
  22. package/dist/runner/event-dispatcher.js.map +1 -0
  23. package/dist/runner/finalizer.d.ts +30 -0
  24. package/dist/runner/finalizer.d.ts.map +1 -0
  25. package/dist/runner/finalizer.js +75 -0
  26. package/dist/runner/finalizer.js.map +1 -0
  27. package/dist/runner/invocation-resolver.d.ts +67 -0
  28. package/dist/runner/invocation-resolver.d.ts.map +1 -0
  29. package/dist/runner/invocation-resolver.js +224 -0
  30. package/dist/runner/invocation-resolver.js.map +1 -0
  31. package/dist/runner/plugin-context.d.ts +18 -0
  32. package/dist/runner/plugin-context.d.ts.map +1 -0
  33. package/dist/runner/plugin-context.js +26 -0
  34. package/dist/runner/plugin-context.js.map +1 -0
  35. package/dist/runner/run-context.d.ts +38 -0
  36. package/dist/runner/run-context.d.ts.map +1 -0
  37. package/dist/runner/run-context.js +159 -0
  38. package/dist/runner/run-context.js.map +1 -0
  39. package/dist/runner/runner-session.d.ts +34 -0
  40. package/dist/runner/runner-session.d.ts.map +1 -0
  41. package/dist/runner/runner-session.js +61 -0
  42. package/dist/runner/runner-session.js.map +1 -0
  43. package/dist/runner/runner.d.ts +1 -2
  44. package/dist/runner/runner.d.ts.map +1 -1
  45. package/dist/runner/runner.js +115 -889
  46. package/dist/runner/runner.js.map +1 -1
  47. package/dist/runner/runtime.d.ts +7 -0
  48. package/dist/runner/runtime.d.ts.map +1 -0
  49. package/dist/runner/runtime.js +21 -0
  50. package/dist/runner/runtime.js.map +1 -0
  51. package/dist/runner/session-lifecycle.d.ts +31 -0
  52. package/dist/runner/session-lifecycle.d.ts.map +1 -0
  53. package/dist/runner/session-lifecycle.js +46 -0
  54. package/dist/runner/session-lifecycle.js.map +1 -0
  55. package/dist/runner/title.d.ts +3 -0
  56. package/dist/runner/title.d.ts.map +1 -0
  57. package/dist/runner/title.js +6 -0
  58. package/dist/runner/title.js.map +1 -0
  59. package/dist/runner/turn-executor.d.ts +51 -0
  60. package/dist/runner/turn-executor.d.ts.map +1 -0
  61. package/dist/runner/turn-executor.js +255 -0
  62. package/dist/runner/turn-executor.js.map +1 -0
  63. package/dist/tools/cron.d.ts +15 -22
  64. package/dist/tools/cron.d.ts.map +1 -1
  65. package/dist/tools/cron.js +20 -40
  66. package/dist/tools/cron.js.map +1 -1
  67. package/dist/types.d.ts +1 -1
  68. package/dist/types.d.ts.map +1 -1
  69. package/package.json +1 -1
  70. package/dist/config-DJX-VM7S.js +0 -198
  71. package/dist/config-DJX-VM7S.js.map +0 -1
  72. package/dist/index-JD6Ye-N5.d.ts +0 -149
  73. package/dist/index-JD6Ye-N5.d.ts.map +0 -1
  74. package/dist/manager-qXa-NP0p.js +0 -1651
  75. package/dist/manager-qXa-NP0p.js.map +0 -1
  76. package/dist/message.d.ts +0 -11
  77. package/dist/message.d.ts.map +0 -1
  78. package/dist/message.js +0 -46
  79. package/dist/message.js.map +0 -1
  80. package/dist/security/command-dangerous-rules.d.ts +0 -4
  81. package/dist/security/command-dangerous-rules.d.ts.map +0 -1
  82. package/dist/security/command-dangerous-rules.js +0 -26
  83. package/dist/security/command-dangerous-rules.js.map +0 -1
  84. package/dist/security/command-parser.d.ts +0 -3
  85. package/dist/security/command-parser.d.ts.map +0 -1
  86. package/dist/security/command-parser.js +0 -191
  87. package/dist/security/command-parser.js.map +0 -1
  88. package/dist/security/command-path-guard.d.ts +0 -10
  89. package/dist/security/command-path-guard.d.ts.map +0 -1
  90. package/dist/security/command-path-guard.js +0 -126
  91. package/dist/security/command-path-guard.js.map +0 -1
  92. package/dist/security/command-policy-config.d.ts +0 -5
  93. package/dist/security/command-policy-config.d.ts.map +0 -1
  94. package/dist/security/command-policy-config.js +0 -212
  95. package/dist/security/command-policy-config.js.map +0 -1
  96. package/dist/security/command-policy-engine.d.ts +0 -8
  97. package/dist/security/command-policy-engine.d.ts.map +0 -1
  98. package/dist/security/command-policy-engine.js +0 -122
  99. package/dist/security/command-policy-engine.js.map +0 -1
  100. package/dist/security/command-policy-types.d.ts +0 -67
  101. package/dist/security/command-policy-types.d.ts.map +0 -1
  102. package/dist/security/command-policy-types.js +0 -2
  103. package/dist/security/command-policy-types.js.map +0 -1
  104. package/dist/security/command-safe-bins.d.ts +0 -4
  105. package/dist/security/command-safe-bins.d.ts.map +0 -1
  106. package/dist/security/command-safe-bins.js +0 -84
  107. package/dist/security/command-safe-bins.js.map +0 -1
  108. package/dist/security/command-trusted-executables.d.ts +0 -6
  109. package/dist/security/command-trusted-executables.d.ts.map +0 -1
  110. package/dist/security/command-trusted-executables.js +0 -57
  111. package/dist/security/command-trusted-executables.js.map +0 -1
@@ -1,84 +0,0 @@
1
- import path from "node:path";
2
- import { unwrapExecutable } from "./command-trusted-executables.js";
3
- const DENIED_FLAGS = {
4
- grep: ["-r", "-R", "--recursive", "--dereference-recursive", "-f", "--file"],
5
- jq: ["-f", "--from-file", "--argfile", "--slurpfile", "--rawfile", "-L", "--library-path"],
6
- sort: ["-o", "--output", "--compress-program", "--files0-from", "--random-source", "--temporary-directory", "-T"],
7
- wc: ["--files0-from"],
8
- };
9
- function basename(value) {
10
- if (!value) {
11
- return "";
12
- }
13
- return path.posix.basename(value).toLowerCase();
14
- }
15
- function includesDeniedFlag(args, deniedFlags) {
16
- for (let index = 0; index < args.length; index += 1) {
17
- const arg = args[index];
18
- for (const denied of deniedFlags) {
19
- if (arg === denied || arg.startsWith(`${denied}=`) || (denied.length === 2 && arg.startsWith(denied) && arg.length > 2)) {
20
- return true;
21
- }
22
- }
23
- }
24
- return false;
25
- }
26
- function countPositionals(args) {
27
- const positionals = [];
28
- let stopFlags = false;
29
- for (const arg of args) {
30
- if (stopFlags) {
31
- positionals.push(arg);
32
- continue;
33
- }
34
- if (arg === "--") {
35
- stopFlags = true;
36
- continue;
37
- }
38
- if (arg.startsWith("-")) {
39
- continue;
40
- }
41
- positionals.push(arg);
42
- }
43
- return positionals;
44
- }
45
- function validateSafeBinArgs(executable, args) {
46
- if (includesDeniedFlag(args, DENIED_FLAGS[executable] ?? [])) {
47
- return false;
48
- }
49
- const positionals = countPositionals(args);
50
- switch (executable) {
51
- case "jq":
52
- return positionals.length <= 1;
53
- case "head":
54
- case "tail":
55
- case "uniq":
56
- case "tr":
57
- case "wc":
58
- case "cut":
59
- return positionals.length === 0;
60
- case "grep":
61
- return positionals.length <= 1;
62
- case "sort":
63
- return positionals.length === 0;
64
- default:
65
- return false;
66
- }
67
- }
68
- export function matchSafeBin(segment, safeBins, allowlist) {
69
- if (!safeBins.enabled) {
70
- return null;
71
- }
72
- const executable = basename(unwrapExecutable(segment, allowlist));
73
- if (!executable) {
74
- return null;
75
- }
76
- if (!safeBins.bins.some((entry) => entry.toLowerCase() === executable)) {
77
- return null;
78
- }
79
- const args = basename(segment.executable) === "env"
80
- ? segment.argv.slice(segment.argv.findIndex((arg) => !/^[A-Za-z_][A-Za-z0-9_]*=/.test(arg) && arg !== "env") + 1)
81
- : segment.argv.slice(1);
82
- return validateSafeBinArgs(executable, args) ? executable : null;
83
- }
84
- //# sourceMappingURL=command-safe-bins.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-safe-bins.js","sourceRoot":"","sources":["../../src/security/command-safe-bins.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import type { CommandAllowlistPolicy, CommandTrustedExecutablesPolicy, ParsedCommandSegment } from "./command-policy-types.js";
2
- export declare function isAllowedWrapper(value: string | null, policy: CommandAllowlistPolicy): boolean;
3
- export declare function unwrapExecutable(segment: ParsedCommandSegment, policy: CommandAllowlistPolicy): string | null;
4
- export declare function matchTrustedExecutable(segment: ParsedCommandSegment, trustedExecutables: CommandTrustedExecutablesPolicy, allowlist: CommandAllowlistPolicy): string | null;
5
- export declare function matchAllowlistExecutable(segment: ParsedCommandSegment, policy: CommandAllowlistPolicy): string | null;
6
- //# sourceMappingURL=command-trusted-executables.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-trusted-executables.d.ts","sourceRoot":"","sources":["../../src/security/command-trusted-executables.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,+BAA+B,EAC/B,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AASnC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAG9F;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAgB7G;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,kBAAkB,EAAE,+BAA+B,EACnD,SAAS,EAAE,sBAAsB,GAChC,MAAM,GAAG,IAAI,CAaf;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,sBAAsB,GAC7B,MAAM,GAAG,IAAI,CAaf"}
@@ -1,57 +0,0 @@
1
- import path from "node:path";
2
- function basename(value) {
3
- if (!value) {
4
- return "";
5
- }
6
- return path.posix.basename(value).toLowerCase();
7
- }
8
- export function isAllowedWrapper(value, policy) {
9
- const name = basename(value);
10
- return policy.wrappers.some((entry) => entry.toLowerCase() === name);
11
- }
12
- export function unwrapExecutable(segment, policy) {
13
- if (!segment.executable) {
14
- return null;
15
- }
16
- if (!isAllowedWrapper(segment.executable, policy)) {
17
- return segment.executable;
18
- }
19
- const wrapperName = basename(segment.executable);
20
- if (wrapperName === "env") {
21
- let index = 1;
22
- while (index < segment.argv.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(segment.argv[index])) {
23
- index += 1;
24
- }
25
- return segment.argv[index] ?? null;
26
- }
27
- return segment.argv[1] ?? null;
28
- }
29
- export function matchTrustedExecutable(segment, trustedExecutables, allowlist) {
30
- const executable = unwrapExecutable(segment, allowlist);
31
- const name = basename(executable);
32
- if (!name || !trustedExecutables.enabled) {
33
- return null;
34
- }
35
- for (const entry of trustedExecutables.executables) {
36
- const entryName = basename(entry);
37
- if (entryName === name) {
38
- return entry;
39
- }
40
- }
41
- return null;
42
- }
43
- export function matchAllowlistExecutable(segment, policy) {
44
- const executable = unwrapExecutable(segment, policy);
45
- const name = basename(executable);
46
- if (!name) {
47
- return null;
48
- }
49
- for (const entry of policy.executables) {
50
- const entryName = basename(entry);
51
- if (entryName === name) {
52
- return entry;
53
- }
54
- }
55
- return null;
56
- }
57
- //# sourceMappingURL=command-trusted-executables.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-trusted-executables.js","sourceRoot":"","sources":["../../src/security/command-trusted-executables.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,SAAS,QAAQ,CAAC,KAAoB;IACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,MAA8B;IACnF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA6B,EAAE,MAA8B;IAC5F,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC,UAAU,CAAC;IAC5B,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC;YAC5F,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAA6B,EAC7B,kBAAmD,EACnD,SAAiC;IAEjC,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,kBAAkB,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAA6B,EAC7B,MAA8B;IAE9B,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}