@undefineds.co/linx 0.2.25 → 0.3.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 (47) hide show
  1. package/README.md +19 -0
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/ai-command.js +154 -62
  5. package/dist/lib/ai-command.js.map +1 -1
  6. package/dist/lib/auto-mode/archive.js +1 -0
  7. package/dist/lib/auto-mode/archive.js.map +1 -1
  8. package/dist/lib/auto-mode/codex-composer.js +5 -1
  9. package/dist/lib/auto-mode/codex-composer.js.map +1 -1
  10. package/dist/lib/auto-mode/display.js +32 -4
  11. package/dist/lib/auto-mode/display.js.map +1 -1
  12. package/dist/lib/auto-mode/hooks/codex.js +15 -1
  13. package/dist/lib/auto-mode/hooks/codex.js.map +1 -1
  14. package/dist/lib/auto-mode/hooks/shared.js +31 -0
  15. package/dist/lib/auto-mode/hooks/shared.js.map +1 -1
  16. package/dist/lib/auto-mode/pod-ai.js +14 -7
  17. package/dist/lib/auto-mode/pod-ai.js.map +1 -1
  18. package/dist/lib/auto-mode/pod-persistence.js +64 -8
  19. package/dist/lib/auto-mode/pod-persistence.js.map +1 -1
  20. package/dist/lib/auto-mode/runner.js +107 -9
  21. package/dist/lib/auto-mode/runner.js.map +1 -1
  22. package/dist/lib/chat-api.js +4 -1
  23. package/dist/lib/chat-api.js.map +1 -1
  24. package/dist/lib/models.js +2 -2
  25. package/dist/lib/models.js.map +1 -1
  26. package/dist/lib/oidc-auth.js +5 -1
  27. package/dist/lib/oidc-auth.js.map +1 -1
  28. package/dist/lib/pi-adapter/runtime.js +105 -8
  29. package/dist/lib/pi-adapter/runtime.js.map +1 -1
  30. package/dist/lib/pi-adapter/session.js +2 -2
  31. package/dist/lib/pi-adapter/session.js.map +1 -1
  32. package/dist/lib/pi-adapter/stream.js +1 -0
  33. package/dist/lib/pi-adapter/stream.js.map +1 -1
  34. package/dist/lib/pod-data-session.js +22 -13
  35. package/dist/lib/pod-data-session.js.map +1 -1
  36. package/dist/lib/symphony/archive.js +169 -0
  37. package/dist/lib/symphony/archive.js.map +1 -0
  38. package/dist/lib/symphony-command.js +272 -0
  39. package/dist/lib/symphony-command.js.map +1 -0
  40. package/dist/skills/pod-storage/SKILL.md +83 -43
  41. package/package.json +10 -9
  42. package/vendor/agent-runtime/dist/auto-mode.d.ts +2 -0
  43. package/vendor/agent-runtime/dist/auto-mode.js +1 -0
  44. package/vendor/agent-runtime/dist/index.d.ts +1 -0
  45. package/vendor/agent-runtime/dist/index.js +1 -0
  46. package/vendor/agent-runtime/dist/symphony.d.ts +136 -0
  47. package/vendor/agent-runtime/dist/symphony.js +214 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symphony-command.js","sourceRoot":"","sources":["../../src/lib/symphony-command.ts"],"names":[],"mappings":"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"}
@@ -1,60 +1,100 @@
1
1
  ---
2
2
  name: pod-storage
3
- description: Pod 文件系统操作 使用 pod_read/pod_write 读写用户 Pod 中的数据。
3
+ description: Resolve durable Pod writes through shared descriptors, Consensus, pod_schema, and pod_storage instead of inventing paths or Turtle.
4
4
  allowed-tools: Read, Write, Edit, Bash, Grep, Glob, pod_read, pod_write
5
5
  ---
6
6
 
7
- # Pod 文件系统
8
-
9
- 用户的数据存储在 Pod 中。访问 Pod 文件使用 `pod_read` / `pod_write`(不是本地 read/write)。
10
-
11
- ## 路径约定
12
-
13
- ```
14
- /alice/
15
- ├── settings/ # 配置和凭据
16
- │ ├── credentials.ttl # 第三方 API key
17
- │ └── preferences.ttl # 用户偏好
18
- ├── logs/ # 工具/Agent 输出日志
19
- │ └── tasks/ # 按任务组织
20
- ├── repos/ # git 仓库工作区
21
- └── data/ # 用户自己的数据
7
+ # Pod Storage
8
+
9
+ Use this skill when the user asks AI Secretary or another agent to save
10
+ credentials, configuration, grants, preferences, or other durable Pod-backed
11
+ data.
12
+
13
+ ## Core Rule
14
+
15
+ Do not invent Pod paths, RDF predicates, subject templates, or Turtle.
16
+
17
+ Durable storage semantics belong to `@undefineds.co/models`:
18
+
19
+ - descriptors,
20
+ - resource base paths,
21
+ - subject templates,
22
+ - field predicates,
23
+ - validation,
24
+ - repository-backed commits.
25
+
26
+ ## Workflow
27
+
28
+ 1. Restate the storage request in structured fields when possible.
29
+ 2. Use the injected `udfs` tool for schema lookup and semantic consensus.
30
+ LinX/linx-lite should provide runtime context for remote Consensus; without
31
+ that context, `udfs` can still run local deterministic schema commands.
32
+ 3. For direct schema lookup, call `udfs schema classes`,
33
+ `udfs schema predicates`, or `udfs schema describe`.
34
+ 4. For ambiguous natural-language storage requests, call `udfs consensus` with a
35
+ JSON input payload.
36
+ The future service-backed path should use the Responses protocol
37
+ (`/v1/conversations` + `/v1/responses`).
38
+ 5. Ask the user any returned clarification questions.
39
+ 6. Continue the same Responses conversation through the `conversation_id`
40
+ request field.
41
+ 7. Build a domain-shaped DTO from the returned `schemaUri` and field mapping.
42
+ 8. Optionally call `udfs storage validate --input <json>` before committing.
43
+ 9. Persist through the shared models ORM/repository, not through hand-written
44
+ Turtle or a resource-specific `udfs` shortcut.
45
+ 10. Report the schema URI, resource summary, and follow-up status.
46
+
47
+ ## Current MVP Check
48
+
49
+ The local verification path is the injected `udfs` tool. Do not call back into
50
+ `linx`; `udfs` must also work when injected into non-LinX coding agents:
51
+
52
+ ```bash
53
+ udfs consensus --input '{"session_id":"sess_123","request":"我要保存这个 Cloudflare token","answers":{"token_type":"tunnel-token"}}' --json
54
+ udfs schema classes --uri 'https://vocab.xpod.dev/credential#Credential'
55
+ udfs schema predicates --uri 'https://vocab.xpod.dev/credential#Credential'
56
+ udfs schema predicates --uri 'https://vocab.xpod.dev/credential#Credential' --field apiKey
22
57
  ```
23
58
 
24
- ## 读写
59
+ Inside LinX or another coding-agent shell, AI should use the injected `udfs`
60
+ tool:
25
61
 
62
+ ```bash
63
+ udfs consensus --input '{"session_id":"sess_123","request":"我要保存这个 Cloudflare token","answers":{"token_type":"tunnel-token"}}' --json
64
+ udfs schema describe 'https://vocab.xpod.dev/credential#Credential'
65
+ udfs schema predicates --uri 'https://vocab.xpod.dev/credential#Credential'
66
+ udfs storage validate --input '{"schemaUri":"https://vocab.xpod.dev/credential#Credential","operation":"upsert","match":{"service":"infra","providerId":"cloudflare","secretType":"tunnel-token"},"set":{"label":"Cloudflare Tunnel Token","status":"active"}}'
26
67
  ```
27
- pod_read /alice/settings/credentials.ttl
28
- pod_write /alice/settings/credentials.ttl "content"
29
- ```
30
-
31
- 用 `pod_read` 读 Pod 文件,`pod_write` 写 Pod 文件。Content-Type 由扩展名自动推断(.ttl → text/turtle)。
32
68
 
33
- ## 凭据约定
69
+ Expected outcome:
34
70
 
35
- 第三方 API key 存在 `/alice/settings/credentials.ttl`,每条一个节点:
71
+ - clarification question: API token or tunnel token,
72
+ - schema URI: `https://vocab.xpod.dev/credential#Credential`,
73
+ - predicate mapping includes `apiKey -> https://vocab.xpod.dev/credential#apiKey`,
74
+ - descriptor storage: `/settings/credentials.ttl#{id}`,
75
+ - validation plan: `/settings/credentials.ttl#infra-cloudflare-tunnel-token`,
76
+ - no commit in `udfs`; actual writes go through shared ORM/repository code.
77
+ - remote Consensus, when available, is reached through injected
78
+ `UDFS_CONSENSUS_BASE_URL` and `UDFS_CONSENSUS_TOKEN`; do not ask the user for a
79
+ command-line API key.
36
80
 
37
- ```turtle
38
- @prefix xpod: <https://undefineds.co/xpod#> .
81
+ ## Secretary Rules
39
82
 
40
- <#jina> xpod:apiKey "jina_xxx" .
41
- <#openai> xpod:apiKey "sk-xxx" .
42
- ```
43
-
44
- 需要 key 时先用 `pod_read` 读这个文件。没有就引导用户去对应网站注册,拿到后用 `pod_write` 写入。
45
-
46
- 写入时注意保留已有内容,只修改目标凭据行。
83
+ - Never store secrets in free-form notes.
84
+ - Never log full secret values.
85
+ - Use validation before risky writes, but persist through model-owned
86
+ repositories/ORM.
87
+ - Treat unmodeled durable data as a model proposal flow, not a permanent
88
+ catch-all note.
89
+ - User/developer-created descriptors must be validated before activation.
47
90
 
48
- ## 查找
91
+ ## Low-Level Pod Tools
49
92
 
50
- 不知道文件在哪时用 `bash` 配合 Pod HTTP API,或用 Grep 搜索本地 Pod mirror。
93
+ `pod_read` and `pod_write` are protocol tools, not modeling tools. Use them only
94
+ when:
51
95
 
52
- ## 日志
96
+ - no shared business model exists yet,
97
+ - the operation is explicitly protocol-level,
98
+ - or you are inspecting raw Pod state for debugging.
53
99
 
54
- 工具执行结果写入 `/alice/logs/`,按任务 ID 分目录:
55
-
56
- ```
57
- /alice/logs/tasks/task-001/
58
- ├── stdout.log
59
- └── result.json
60
- ```
100
+ If a shared model exists, use model-owned helpers instead of hand-editing Turtle.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/linx",
3
- "version": "0.2.25",
3
+ "version": "0.3.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -12,16 +12,17 @@
12
12
  "test": "yarn build && node --test --test-concurrency=1 test/**/*.test.mjs"
13
13
  },
14
14
  "dependencies": {
15
- "@undefineds.co/models": "0.2.25",
16
- "@inrupt/solid-client-authn-node": "^3.1.1",
17
- "@mariozechner/pi-coding-agent": "^0.67.6",
18
- "n3": "^1.26.0",
19
- "yargs": "^17.7.2",
20
- "@zed-industries/codex-acp": "^0.9.5"
15
+ "@inrupt/solid-client-authn-node": "^4.0.0",
16
+ "@mariozechner/pi-coding-agent": "^0.73.1",
17
+ "@sinclair/typebox": "^0.34.49",
18
+ "@undefineds.co/models": "0.2.34",
19
+ "@zed-industries/codex-acp": "0.14.0",
20
+ "n3": "^2.0.3",
21
+ "yargs": "^18.0.0"
21
22
  },
22
23
  "devDependencies": {
23
- "@types/node": "^24.10.1",
24
- "typescript": "^5.6.2"
24
+ "@types/node": "^25.9.1",
25
+ "typescript": "^6.0.3"
25
26
  },
26
27
  "files": [
27
28
  "dist",
@@ -33,6 +33,7 @@ export interface AutoModeSessionRecord {
33
33
  runtime: AutoModeRuntime;
34
34
  transport?: AutoModeTransport;
35
35
  mode: AutoModeMode;
36
+ goalMode?: boolean;
36
37
  cwd: string;
37
38
  model?: string;
38
39
  prompt?: string;
@@ -192,6 +193,7 @@ export interface AutoModeThreadMetadata extends Record<string, unknown> {
192
193
  runtime: AutoModeRuntime;
193
194
  transport?: AutoModeTransport;
194
195
  mode: AutoModeMode;
196
+ goalMode?: boolean;
195
197
  cwd: string;
196
198
  model?: string;
197
199
  credentialSource: AutoModeCredentialSource;
@@ -1380,6 +1380,7 @@ export function buildAutoModeThreadMetadata(record) {
1380
1380
  runtime: record.runtime,
1381
1381
  transport: record.transport,
1382
1382
  mode: record.mode,
1383
+ ...(record.goalMode !== undefined ? { goalMode: record.goalMode } : {}),
1383
1384
  cwd: record.cwd,
1384
1385
  model: record.model,
1385
1386
  credentialSource: record.credentialSource,
@@ -2,4 +2,5 @@ export * from './acp.js';
2
2
  export * from './auto-mode.js';
3
3
  export * from './companion-model.js';
4
4
  export * from './runtime.js';
5
+ export * from './symphony.js';
5
6
  export * from './turn-controller.js';
@@ -2,4 +2,5 @@ export * from './acp.js';
2
2
  export * from './auto-mode.js';
3
3
  export * from './companion-model.js';
4
4
  export * from './runtime.js';
5
+ export * from './symphony.js';
5
6
  export * from './turn-controller.js';
@@ -0,0 +1,136 @@
1
+ import type { AutoModeBackend, AutoModeMode } from './auto-mode.js';
2
+ export declare const SYMPHONY_HOME_DIRNAME = "symphony";
3
+ export declare const SYMPHONY_ISSUES_DIRNAME = "issues";
4
+ export declare const SYMPHONY_DELIVERIES_DIRNAME = "deliveries";
5
+ export declare const SYMPHONY_SESSIONS_DIRNAME = "sessions";
6
+ export declare const SYMPHONY_ISSUE_FILE_NAME = "issue.json";
7
+ export declare const SYMPHONY_DELIVERY_FILE_NAME = "delivery.json";
8
+ export declare const SYMPHONY_SESSION_FILE_NAME = "session.json";
9
+ export type SymphonyWorkspaceKind = 'git' | 'folder';
10
+ export type SymphonyIssueStatus = 'open' | 'triaging' | 'in_progress' | 'blocked' | 'resolved' | 'closed';
11
+ export type SymphonyDeliveryStatus = 'pending' | 'dispatched' | 'completed' | 'failed';
12
+ export type SymphonySessionStatus = 'planned' | 'running' | 'completed' | 'failed';
13
+ export type SymphonyProjectionRole = 'user' | 'system' | 'tool';
14
+ export type SymphonyResourceKind = 'issue' | 'task' | 'delivery' | 'session';
15
+ export interface SymphonyWorkspaceRef {
16
+ path: string;
17
+ kind: SymphonyWorkspaceKind;
18
+ repository?: string;
19
+ branch?: string;
20
+ worktree?: string;
21
+ }
22
+ export interface SymphonyChatThreadRef {
23
+ chat?: string;
24
+ thread?: string;
25
+ messages?: string[];
26
+ }
27
+ export interface SymphonyIssueRecord extends SymphonyChatThreadRef {
28
+ uri: string;
29
+ title: string;
30
+ description?: string;
31
+ status: SymphonyIssueStatus;
32
+ priority: 'low' | 'medium' | 'high' | 'urgent';
33
+ source: 'cli';
34
+ tasks: string[];
35
+ createdAt: string;
36
+ updatedAt: string;
37
+ closedAt?: string;
38
+ error?: string;
39
+ }
40
+ export interface SymphonyDeliveryRecord extends SymphonyChatThreadRef {
41
+ uri: string;
42
+ issue: string;
43
+ task: string;
44
+ type: 'task_dispatch';
45
+ status: SymphonyDeliveryStatus;
46
+ sourceAgent: 'ai-secretary';
47
+ targetBackend: AutoModeBackend;
48
+ targetAgent: string;
49
+ projection: {
50
+ runtimeRole: SymphonyProjectionRole;
51
+ prompt: string;
52
+ };
53
+ session?: string;
54
+ autoModeSessionId?: string;
55
+ createdAt: string;
56
+ updatedAt: string;
57
+ completedAt?: string;
58
+ error?: string;
59
+ }
60
+ export interface SymphonySessionRecord extends SymphonyChatThreadRef {
61
+ uri: string;
62
+ issue: string;
63
+ task: string;
64
+ delivery: string;
65
+ backend: AutoModeBackend;
66
+ mode: AutoModeMode;
67
+ status: SymphonySessionStatus;
68
+ cwd: string;
69
+ model?: string;
70
+ autoModeSessionId?: string;
71
+ dryRun?: boolean;
72
+ exitCode?: number | null;
73
+ createdAt: string;
74
+ updatedAt: string;
75
+ completedAt?: string;
76
+ error?: string;
77
+ }
78
+ export interface SymphonyRunPlan {
79
+ issue: SymphonyIssueRecord;
80
+ task: string;
81
+ delivery: SymphonyDeliveryRecord;
82
+ session: SymphonySessionRecord;
83
+ }
84
+ export interface CreateSymphonyRunPlanInput {
85
+ objective: string;
86
+ title?: string;
87
+ acceptanceCriteria?: string[];
88
+ workspacePath: string;
89
+ workspaceKind?: SymphonyWorkspaceKind;
90
+ repository?: string;
91
+ branch?: string;
92
+ worktree?: string;
93
+ backend: AutoModeBackend;
94
+ mode: AutoModeMode;
95
+ model?: string;
96
+ chat?: string;
97
+ thread?: string;
98
+ messages?: string[];
99
+ now?: Date;
100
+ randomId?: string;
101
+ }
102
+ export declare function createSymphonyIssueUri(options?: {
103
+ now?: Date;
104
+ randomId?: string;
105
+ }): string;
106
+ export declare function createTaskUri(options?: {
107
+ now?: Date;
108
+ randomId?: string;
109
+ }): string;
110
+ export declare function createSymphonyDeliveryUri(options?: {
111
+ now?: Date;
112
+ randomId?: string;
113
+ }): string;
114
+ export declare function createSymphonySessionUri(options?: {
115
+ now?: Date;
116
+ randomId?: string;
117
+ }): string;
118
+ export declare function getSymphonyArchiveRelativePaths(uri: string, kind: 'issue' | 'delivery' | 'session'): {
119
+ dir: string;
120
+ file: string;
121
+ };
122
+ export declare function createRunPlan(input: CreateSymphonyRunPlanInput): SymphonyRunPlan;
123
+ export declare function renderSymphonyRuntimePrompt(input: {
124
+ issue?: SymphonyIssueRecord;
125
+ task: string;
126
+ objective: string;
127
+ acceptanceCriteria?: string[];
128
+ workspace: SymphonyWorkspaceRef;
129
+ backend: AutoModeBackend;
130
+ mode: AutoModeMode;
131
+ session: string;
132
+ }): string;
133
+ export declare function formatSymphonySessionSummary(session: SymphonySessionRecord): string;
134
+ export declare function formatSymphonyDeliverySummary(delivery: SymphonyDeliveryRecord): string;
135
+ export declare function formatSymphonyIssueSummary(issue: SymphonyIssueRecord): string;
136
+ export declare function getSymphonyArchiveKey(uri: string): string;
@@ -0,0 +1,214 @@
1
+ export const SYMPHONY_HOME_DIRNAME = 'symphony';
2
+ export const SYMPHONY_ISSUES_DIRNAME = 'issues';
3
+ export const SYMPHONY_DELIVERIES_DIRNAME = 'deliveries';
4
+ export const SYMPHONY_SESSIONS_DIRNAME = 'sessions';
5
+ export const SYMPHONY_ISSUE_FILE_NAME = 'issue.json';
6
+ export const SYMPHONY_DELIVERY_FILE_NAME = 'delivery.json';
7
+ export const SYMPHONY_SESSION_FILE_NAME = 'session.json';
8
+ const SYMPHONY_URI_PREFIX = 'urn:undefineds:linx';
9
+ export function createSymphonyIssueUri(options = {}) {
10
+ return createSymphonyResourceUri('issue', options);
11
+ }
12
+ export function createTaskUri(options = {}) {
13
+ return createSymphonyResourceUri('task', options);
14
+ }
15
+ export function createSymphonyDeliveryUri(options = {}) {
16
+ return createSymphonyResourceUri('delivery', options);
17
+ }
18
+ export function createSymphonySessionUri(options = {}) {
19
+ return createSymphonyResourceUri('session', options);
20
+ }
21
+ export function getSymphonyArchiveRelativePaths(uri, kind) {
22
+ const key = getSymphonyArchiveKey(uri);
23
+ const dirName = kind === 'issue'
24
+ ? SYMPHONY_ISSUES_DIRNAME
25
+ : kind === 'delivery'
26
+ ? SYMPHONY_DELIVERIES_DIRNAME
27
+ : SYMPHONY_SESSIONS_DIRNAME;
28
+ const fileName = kind === 'issue'
29
+ ? SYMPHONY_ISSUE_FILE_NAME
30
+ : kind === 'delivery'
31
+ ? SYMPHONY_DELIVERY_FILE_NAME
32
+ : SYMPHONY_SESSION_FILE_NAME;
33
+ return {
34
+ dir: `${dirName}/${key}`,
35
+ file: `${dirName}/${key}/${fileName}`,
36
+ };
37
+ }
38
+ export function createRunPlan(input) {
39
+ const now = input.now ?? new Date();
40
+ const timestamp = now.toISOString();
41
+ const randomId = normalizeSymphonyRandomId(input.randomId);
42
+ const uriOptions = { now, randomId };
43
+ const objective = normalizeRequiredText(input.objective, 'objective');
44
+ const title = normalizeOptionalText(input.title) ?? createSymphonyTitle(objective);
45
+ const acceptanceCriteria = normalizeSymphonyAcceptanceCriteria(input.acceptanceCriteria);
46
+ const chatThread = normalizeSymphonyChatThreadRef(input);
47
+ const workspace = {
48
+ path: normalizeRequiredText(input.workspacePath, 'workspacePath'),
49
+ kind: input.workspaceKind ?? 'folder',
50
+ ...(normalizeOptionalText(input.repository) ? { repository: normalizeOptionalText(input.repository) } : {}),
51
+ ...(normalizeOptionalText(input.branch) ? { branch: normalizeOptionalText(input.branch) } : {}),
52
+ ...(normalizeOptionalText(input.worktree) ? { worktree: normalizeOptionalText(input.worktree) } : {}),
53
+ };
54
+ const issueUri = createSymphonyIssueUri(uriOptions);
55
+ const taskUri = createTaskUri(uriOptions);
56
+ const deliveryUri = createSymphonyDeliveryUri(uriOptions);
57
+ const sessionUri = createSymphonySessionUri(uriOptions);
58
+ const issue = {
59
+ uri: issueUri,
60
+ title,
61
+ description: objective,
62
+ status: 'open',
63
+ priority: 'medium',
64
+ source: 'cli',
65
+ tasks: [taskUri],
66
+ ...chatThread,
67
+ createdAt: timestamp,
68
+ updatedAt: timestamp,
69
+ };
70
+ const session = {
71
+ uri: sessionUri,
72
+ issue: issueUri,
73
+ task: taskUri,
74
+ delivery: deliveryUri,
75
+ backend: input.backend,
76
+ mode: input.mode,
77
+ status: 'planned',
78
+ cwd: workspace.path,
79
+ ...(normalizeOptionalText(input.model) ? { model: normalizeOptionalText(input.model) } : {}),
80
+ ...chatThread,
81
+ createdAt: timestamp,
82
+ updatedAt: timestamp,
83
+ };
84
+ const delivery = {
85
+ uri: deliveryUri,
86
+ issue: issueUri,
87
+ task: taskUri,
88
+ type: 'task_dispatch',
89
+ status: 'pending',
90
+ sourceAgent: 'ai-secretary',
91
+ targetBackend: input.backend,
92
+ targetAgent: `${input.backend}-worker`,
93
+ projection: {
94
+ runtimeRole: 'user',
95
+ prompt: renderSymphonyRuntimePrompt({
96
+ issue,
97
+ task: taskUri,
98
+ objective,
99
+ acceptanceCriteria,
100
+ workspace,
101
+ backend: input.backend,
102
+ mode: input.mode,
103
+ session: sessionUri,
104
+ }),
105
+ },
106
+ session: sessionUri,
107
+ ...chatThread,
108
+ createdAt: timestamp,
109
+ updatedAt: timestamp,
110
+ };
111
+ return { issue, task: taskUri, delivery, session };
112
+ }
113
+ export function renderSymphonyRuntimePrompt(input) {
114
+ const acceptanceCriteria = normalizeSymphonyAcceptanceCriteria(input.acceptanceCriteria);
115
+ const criteria = acceptanceCriteria.length > 0
116
+ ? acceptanceCriteria.map((item, index) => `${index + 1}. ${item}`).join('\n')
117
+ : '1. Complete the objective and report concrete verification evidence.';
118
+ return [
119
+ '# LinX Symphony Task',
120
+ '',
121
+ ...(input.issue ? [`Issue URI: ${input.issue.uri}`] : []),
122
+ `Task URI: ${input.task}`,
123
+ `Session URI: ${input.session}`,
124
+ `Backend: ${input.backend}`,
125
+ `Mode: ${input.mode}`,
126
+ `Workspace: ${input.workspace.path}`,
127
+ `Workspace kind: ${input.workspace.kind}`,
128
+ '',
129
+ '## Objective',
130
+ input.objective,
131
+ '',
132
+ '## Acceptance Criteria',
133
+ criteria,
134
+ '',
135
+ '## Execution Contract',
136
+ '- Start and maintain this as the active goal for the worker session until the acceptance criteria are met.',
137
+ '- Work only inside the workspace unless the task explicitly requires otherwise.',
138
+ '- Treat this prompt as a delegated task from the user via AI Secretary.',
139
+ '- Treat later Secretary messages in this session as Steer or follow-up Delivery updates, not as a replacement for the Goal.',
140
+ '- Preserve a concise report with changed files, commands run, and remaining risks.',
141
+ '- If blocked by missing credentials, destructive actions, or unclear scope, report the blocker instead of guessing.',
142
+ ].join('\n');
143
+ }
144
+ export function formatSymphonySessionSummary(session) {
145
+ const linked = session.autoModeSessionId ? ` -> ${session.autoModeSessionId}` : '';
146
+ return `${formatSymphonyUri(session.uri)} ${session.status} ${session.backend}/${session.mode}${linked} (${session.cwd})`;
147
+ }
148
+ export function formatSymphonyDeliverySummary(delivery) {
149
+ return `${formatSymphonyUri(delivery.uri)} ${delivery.status} ${delivery.sourceAgent} -> ${delivery.targetBackend} (${formatSymphonyUri(delivery.issue)}/${formatSymphonyUri(delivery.task)})`;
150
+ }
151
+ export function formatSymphonyIssueSummary(issue) {
152
+ return `${formatSymphonyUri(issue.uri)} ${issue.status} ${issue.title} (${issue.tasks.length} task${issue.tasks.length === 1 ? '' : 's'})`;
153
+ }
154
+ export function getSymphonyArchiveKey(uri) {
155
+ const trimmed = uri.trim();
156
+ if (!trimmed) {
157
+ throw new Error('Missing Symphony resource URI');
158
+ }
159
+ const tail = trimmed.match(/[:/#]([^:/#]+)$/u)?.[1] ?? trimmed;
160
+ const key = decodeURIComponent(tail)
161
+ .replace(/[^a-zA-Z0-9._-]/gu, '-')
162
+ .replace(/-+/gu, '-')
163
+ .replace(/^-|-$/gu, '');
164
+ return key || Buffer.from(trimmed).toString('base64url');
165
+ }
166
+ function createSymphonyResourceUri(kind, options = {}) {
167
+ const key = `${kind}_${formatSymphonyTimestamp(options.now)}_${normalizeSymphonyRandomId(options.randomId)}`;
168
+ return `${SYMPHONY_URI_PREFIX}:${kind}:${key}`;
169
+ }
170
+ function formatSymphonyUri(uri) {
171
+ return getSymphonyArchiveKey(uri);
172
+ }
173
+ function createSymphonyTitle(objective) {
174
+ const compact = objective.replace(/\s+/gu, ' ').trim();
175
+ return compact.length > 80 ? `${compact.slice(0, 77)}...` : compact;
176
+ }
177
+ function normalizeSymphonyAcceptanceCriteria(criteria) {
178
+ return (criteria ?? [])
179
+ .flatMap((item) => item.split(/\r?\n/u))
180
+ .map((item) => item.trim())
181
+ .filter(Boolean);
182
+ }
183
+ function normalizeRequiredText(value, name) {
184
+ const normalized = normalizeOptionalText(value);
185
+ if (!normalized) {
186
+ throw new Error(`Missing Symphony ${name}`);
187
+ }
188
+ return normalized;
189
+ }
190
+ function normalizeOptionalText(value) {
191
+ const normalized = typeof value === 'string' ? value.trim() : '';
192
+ return normalized || undefined;
193
+ }
194
+ function normalizeSymphonyChatThreadRef(input) {
195
+ const chat = normalizeOptionalText(input.chat);
196
+ const thread = normalizeOptionalText(input.thread);
197
+ const messages = (input.messages ?? [])
198
+ .map((item) => normalizeOptionalText(item))
199
+ .filter((item) => Boolean(item));
200
+ return {
201
+ ...(chat ? { chat } : {}),
202
+ ...(thread ? { thread } : {}),
203
+ ...(messages.length > 0 ? { messages } : {}),
204
+ };
205
+ }
206
+ function formatSymphonyTimestamp(now = new Date()) {
207
+ return now.toISOString().replace(/[:.]/gu, '-');
208
+ }
209
+ function normalizeSymphonyRandomId(randomId) {
210
+ const normalized = typeof randomId === 'string'
211
+ ? randomId.replace(/[^a-zA-Z0-9_-]/gu, '').slice(0, 12)
212
+ : '';
213
+ return normalized || Math.random().toString(36).slice(2, 10);
214
+ }