@vimhead.dev/norn-cli 0.1.0-tip.35390859630.1 → 0.1.0-tip.35568631545.1

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 (97) hide show
  1. package/assets/README.md +36 -15
  2. package/assets/docs/README.md +4 -4
  3. package/assets/docs/agents.md +39 -11
  4. package/assets/docs/cli.md +6 -6
  5. package/assets/docs/composition.md +12 -12
  6. package/assets/docs/persistence.md +31 -17
  7. package/assets/docs/providers.md +2 -2
  8. package/assets/docs/recovery.md +1 -1
  9. package/assets/docs/workflows.md +29 -17
  10. package/assets/examples/agent-then-analysis/README.md +8 -8
  11. package/assets/examples/agent-then-analysis/plugin.ts +23 -21
  12. package/assets/examples/caller-selected-continuation/README.md +11 -10
  13. package/assets/examples/caller-selected-continuation/caller.ts +15 -13
  14. package/assets/examples/caller-selected-continuation/producer.ts +11 -8
  15. package/assets/examples/coordinating-multiple-agents/README.md +27 -17
  16. package/assets/examples/coordinating-multiple-agents/plugin.ts +64 -41
  17. package/assets/examples/coordinating-multiple-agents/queue-tools.ts +43 -0
  18. package/assets/examples/coordinating-multiple-agents/work-queue.ts +60 -65
  19. package/assets/examples/getting-started/README.md +25 -10
  20. package/assets/examples/getting-started/plugin.ts +30 -11
  21. package/assets/examples/minimal-workflow/README.md +7 -6
  22. package/assets/examples/minimal-workflow/plugin.ts +8 -5
  23. package/assets/examples/shared-state/README.md +5 -5
  24. package/assets/examples/shared-state/plugin.ts +38 -25
  25. package/assets/examples/shared-state/shared-state.ts +30 -49
  26. package/assets/examples/shared-state/state-tools.ts +68 -0
  27. package/assets/examples/worktree-development-loop/README.md +14 -12
  28. package/assets/examples/worktree-development-loop/scope.ts +1 -1
  29. package/assets/examples/worktree-development-loop/workflows/development-loop/execute.ts +3 -3
  30. package/assets/examples/worktree-development-loop/workflows/development-loop/repository.ts +6 -4
  31. package/assets/examples/worktree-development-loop/workflows/implementation/execute.ts +12 -11
  32. package/assets/examples/worktree-development-loop/workflows/implementation/schema.ts +2 -3
  33. package/assets/examples/worktree-development-loop/workflows/planning/execute.ts +10 -6
  34. package/assets/examples/worktree-development-loop/workflows/review/execute.ts +14 -11
  35. package/assets/examples/worktree-development-loop/workflows/review/schema.ts +1 -2
  36. package/assets/examples/worktree-development-loop/workflows/review-router/execute.ts +16 -15
  37. package/assets/examples/worktree-development-loop/workflows/review-router/schema.ts +1 -2
  38. package/assets/package.json +1 -1
  39. package/assets/packages/cli/src/cli.ts +9 -3
  40. package/assets/packages/cli/src/generated-build-info.ts +2 -2
  41. package/assets/packages/cli/src/internal/agents.ts +24 -32
  42. package/assets/packages/cli/src/internal/commands.ts +2 -14
  43. package/assets/packages/cli/src/internal/engine.ts +35 -49
  44. package/assets/packages/cli/src/internal/execution-context.ts +64 -0
  45. package/assets/packages/cli/src/internal/logs.ts +1 -1
  46. package/assets/packages/cli/src/internal/run-log.ts +1 -1
  47. package/assets/packages/cli/src/internal/run-state.ts +7 -2
  48. package/assets/packages/cli/src/internal/worker-directory.ts +17 -0
  49. package/assets/packages/cli/src/internal/workflow-registry.ts +24 -9
  50. package/assets/packages/cli/src/internal/working-directory.ts +6 -0
  51. package/assets/packages/cli/src/workflow-loader.ts +1 -2
  52. package/assets/packages/sdk/src/api.ts +65 -91
  53. package/assets/packages/sdk/src/index.ts +0 -3
  54. package/assets/tests/workflow-ref.test.ts +9 -9
  55. package/dist/cli.js +8 -3
  56. package/dist/generated-build-info.d.ts +2 -2
  57. package/dist/generated-build-info.js +2 -2
  58. package/dist/internal/agents.d.ts +0 -4
  59. package/dist/internal/agents.js +30 -46
  60. package/dist/internal/commands.d.ts +0 -4
  61. package/dist/internal/commands.js +2 -10
  62. package/dist/internal/engine.d.ts +1 -1
  63. package/dist/internal/engine.js +29 -43
  64. package/dist/internal/execution-context.d.ts +26 -0
  65. package/dist/internal/execution-context.js +55 -0
  66. package/dist/internal/file-coordinator.d.ts +17 -0
  67. package/dist/internal/file-coordinator.js +162 -0
  68. package/dist/internal/logs.d.ts +1 -1
  69. package/dist/internal/run-log.d.ts +1 -1
  70. package/dist/internal/run-state.d.ts +2 -0
  71. package/dist/internal/run-state.js +5 -2
  72. package/dist/internal/worker-directory.d.ts +1 -0
  73. package/dist/internal/worker-directory.js +26 -0
  74. package/dist/internal/workflow-registry.d.ts +13 -3
  75. package/dist/internal/workflow-registry.js +12 -7
  76. package/dist/internal/working-directory.d.ts +1 -0
  77. package/dist/internal/working-directory.js +9 -0
  78. package/dist/workflow-loader.js +1 -2
  79. package/package.json +2 -2
  80. package/assets/docs/resources.md +0 -46
  81. package/assets/examples/coordinating-multiple-agents/queue-adapter.ts +0 -51
  82. package/assets/examples/shared-state/state-adapter.ts +0 -76
  83. package/assets/packages/cli/src/internal/artifacts.ts +0 -26
  84. package/assets/packages/cli/src/internal/resource-bindings.ts +0 -35
  85. package/assets/packages/cli/src/internal/run.ts +0 -127
  86. package/assets/packages/cli/src/resources.ts +0 -69
  87. package/assets/packages/sdk/src/agent-resource-adapter.ts +0 -11
  88. package/assets/packages/sdk/src/resources.ts +0 -20
  89. package/dist/internal/artifacts.d.ts +0 -10
  90. package/dist/internal/artifacts.js +0 -29
  91. package/dist/internal/resource-bindings.d.ts +0 -13
  92. package/dist/internal/resource-bindings.js +0 -34
  93. package/dist/internal/run.d.ts +0 -49
  94. package/dist/internal/run.js +0 -103
  95. package/dist/resources.d.ts +0 -11
  96. package/dist/resources.js +0 -100
  97. /package/assets/packages/{sdk/src/files.ts → cli/src/internal/file-coordinator.ts} +0 -0
@@ -1,103 +0,0 @@
1
- // src/internal/run.ts
2
- import { isAbsolute, relative, resolve, sep } from "node:path";
3
-
4
- // ../core/src/workflow-transition.ts
5
- function createWorkflowTransition(input) {
6
- if (typeof input.workflowId !== "string" || input.workflowId.trim().length === 0) throw new Error("Workflow transition requires a nonempty workflow ID");
7
- return { type: "next", workflowId: input.workflowId, args: input.args };
8
- }
9
-
10
- // src/internal/run.ts
11
- import { NornAgentRunner } from "./agents.js";
12
- import { NornCommandRunner } from "./commands.js";
13
- var NornRunContext = class _NornRunContext {
14
- constructor(input) {
15
- this.input = input;
16
- this.id = input.id;
17
- this.workspace = input.workspace;
18
- this.projectRoot = input.projectRoot;
19
- this.cwd = input.cwd;
20
- this.resources = input.resources;
21
- this.artifacts = input.artifacts;
22
- this.logs = {
23
- read: (log) => this.input.logs.read(log)
24
- };
25
- this.commands = {
26
- run: (commandInput) => new NornCommandRunner({
27
- boundaryRoot: this.boundaryRoot,
28
- boundaryName: this.input.isolationMode,
29
- cwd: this.cwd,
30
- signal: this.input.signal,
31
- logs: this.input.logs,
32
- logger: this.input.logger
33
- }).run(commandInput)
34
- };
35
- this.agents = {
36
- createSession: (agentInput) => this.createAgentRunner().createSession(agentInput),
37
- prompt: (agentInput) => this.createAgentRunner().prompt(agentInput)
38
- };
39
- }
40
- input;
41
- resources;
42
- artifacts;
43
- logs;
44
- commands;
45
- agents;
46
- id;
47
- workspace;
48
- projectRoot;
49
- cwd;
50
- forWorkflow(workflow) {
51
- const isolationMode = workflow.isolation.mode;
52
- return new _NornRunContext({
53
- ...this.input,
54
- isolationMode,
55
- cwd: isolationMode === "project" ? this.projectRoot : this.workspace
56
- });
57
- }
58
- get boundaryRoot() {
59
- return this.input.isolationMode === "project" ? this.projectRoot : this.workspace;
60
- }
61
- createAgentRunner() {
62
- return new NornAgentRunner({
63
- id: this.id,
64
- runRoot: this.input.runRoot,
65
- boundaryRoot: this.boundaryRoot,
66
- boundaryName: this.input.isolationMode,
67
- cwd: this.cwd,
68
- signal: this.input.signal,
69
- model: this.input.model,
70
- thinkingLevel: this.input.thinkingLevel,
71
- agentDir: this.input.agentDir,
72
- logs: this.input.logs,
73
- logger: this.input.logger,
74
- responseCollector: this.input.responseCollector
75
- });
76
- }
77
- path(relativePath) {
78
- return this.resolveFromRoot(this.cwd, this.boundaryRoot, relativePath);
79
- }
80
- projectPath(relativePath) {
81
- return this.resolveFromRoot(this.projectRoot, this.projectRoot, relativePath);
82
- }
83
- next(workflowId, args) {
84
- return createWorkflowTransition({ workflowId, args });
85
- }
86
- complete(metadata) {
87
- return { type: "complete", metadata };
88
- }
89
- fail(metadata) {
90
- return { type: "fail", metadata };
91
- }
92
- resolveFromRoot(root, boundaryRoot, path) {
93
- const resolvedPath = isAbsolute(path) ? path : resolve(root, path);
94
- const pathFromBoundary = relative(boundaryRoot, resolvedPath);
95
- if (pathFromBoundary === ".." || pathFromBoundary.startsWith(`..${sep}`) || isAbsolute(pathFromBoundary)) {
96
- throw new Error(`Workflow path escapes ${this.input.isolationMode} isolation: ${path}`);
97
- }
98
- return resolvedPath;
99
- }
100
- };
101
- export {
102
- NornRunContext
103
- };
@@ -1,11 +0,0 @@
1
- import type { NornResourceDefinition, NornResources } from "@vimhead.dev/norn";
2
- import { type NornFileCoordinator } from "@vimhead.dev/norn/files";
3
- export declare class NornRunResources implements NornResources {
4
- private readonly runRoot;
5
- readonly files: NornFileCoordinator;
6
- private readonly entries;
7
- private constructor();
8
- static initialize(runRoot: string): Promise<NornRunResources>;
9
- ensure<T>(definition: NornResourceDefinition<T>): Promise<T>;
10
- private initializeResource;
11
- }
package/dist/resources.js DELETED
@@ -1,100 +0,0 @@
1
- // ../core/src/atomic-files.ts
2
- import { randomUUID } from "node:crypto";
3
- import { chmod, mkdir, rename, rm, stat, writeFile } from "node:fs/promises";
4
- import { dirname } from "node:path";
5
-
6
- // ../core/src/errors.ts
7
- function isNodeError(error) {
8
- return error instanceof Error && "code" in error;
9
- }
10
-
11
- // ../core/src/atomic-files.ts
12
- async function writeJsonAtomically(path, value) {
13
- await writeTextAtomically(path, `${JSON.stringify(value, null, 2)}
14
- `);
15
- }
16
- async function writeTextAtomically(path, content) {
17
- await mkdir(dirname(path), { recursive: true });
18
- let existingMode;
19
- try {
20
- existingMode = (await stat(path)).mode & 511;
21
- } catch (error) {
22
- if (!isNodeError(error) || error.code !== "ENOENT") throw error;
23
- }
24
- const tmpPath = `${path}.${randomUUID()}.tmp`;
25
- try {
26
- await writeFile(tmpPath, content, { encoding: "utf8", mode: existingMode });
27
- if (existingMode !== void 0) await chmod(tmpPath, existingMode);
28
- await rename(tmpPath, path);
29
- } catch (error) {
30
- await rm(tmpPath, { force: true }).catch(() => void 0);
31
- throw error;
32
- }
33
- }
34
-
35
- // src/resources.ts
36
- import { createRunFileCoordinator } from "@vimhead.dev/norn/files";
37
- import { jsonValueSchema } from "@vimhead.dev/norn/schema";
38
- import { mkdir as mkdir2, readFile } from "node:fs/promises";
39
- import { join, resolve } from "node:path";
40
- import { isDeepStrictEqual } from "node:util";
41
- import { Type } from "typebox";
42
- import { Value } from "typebox/value";
43
- var definitionSchema = Type.Object({ name: Type.String(), kind: Type.String({ minLength: 1 }), configuration: jsonValueSchema }, { additionalProperties: false });
44
- var recordSchema = Type.Object({ ...definitionSchema.properties, isInitialized: Type.Boolean() }, { additionalProperties: false });
45
- var NornRunResources = class _NornRunResources {
46
- constructor(runRoot) {
47
- this.runRoot = runRoot;
48
- this.files = createRunFileCoordinator(runRoot);
49
- }
50
- runRoot;
51
- files;
52
- entries = /* @__PURE__ */ new Map();
53
- static async initialize(runRoot) {
54
- const resources = new _NornRunResources(resolve(runRoot));
55
- await mkdir2(join(resources.runRoot, "current", "resources"), { recursive: true });
56
- return resources;
57
- }
58
- async ensure(definition) {
59
- if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(definition.name)) throw new Error(`Invalid resource name: ${definition.name}`);
60
- const identity = structuredClone(Value.Parse(definitionSchema, { name: definition.name, kind: definition.kind, configuration: definition.configuration }));
61
- const existing = this.entries.get(definition.name);
62
- if (existing) {
63
- if (!isDeepStrictEqual(existing.definition, identity)) throw new Error(`Incompatible resource definition: ${definition.name}`);
64
- return existing.value;
65
- }
66
- const value = this.initializeResource(definition, identity);
67
- const entry = { definition: identity, value };
68
- this.entries.set(definition.name, entry);
69
- try {
70
- return await value;
71
- } catch (error) {
72
- if (this.entries.get(definition.name) === entry) this.entries.delete(definition.name);
73
- throw error;
74
- }
75
- }
76
- async initializeResource(definition, identity) {
77
- const directory = join(this.runRoot, "current", "resources", definition.name);
78
- await mkdir2(directory, { recursive: true });
79
- return this.files.withExclusiveLock(join(directory, "definition.json"), async (path) => {
80
- let stored;
81
- try {
82
- stored = Value.Parse(recordSchema, JSON.parse(await readFile(path, "utf8")));
83
- } catch (error) {
84
- if (!isNodeError(error) || error.code !== "ENOENT") throw error;
85
- }
86
- if (stored) {
87
- const { isInitialized: _isInitialized, ...storedIdentity } = stored;
88
- if (!isDeepStrictEqual(storedIdentity, identity)) throw new Error(`Incompatible resource definition: ${definition.name}`);
89
- } else {
90
- await writeJsonAtomically(path, { ...identity, isInitialized: false });
91
- }
92
- const value = await definition.initialize({ directory, files: this.files, mode: stored?.isInitialized ? "open" : "create" });
93
- if (!stored?.isInitialized) await writeJsonAtomically(path, { ...identity, isInitialized: true });
94
- return value;
95
- });
96
- }
97
- };
98
- export {
99
- NornRunResources
100
- };