@undefineds.co/linx 0.3.29 → 0.3.31

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 (33) hide show
  1. package/dist/lib/codex-plugin/symphony-mcp.js +3 -3
  2. package/dist/lib/codex-plugin/symphony-mcp.js.map +1 -1
  3. package/dist/lib/linx-interactive-command-routing.js +0 -9
  4. package/dist/lib/linx-interactive-command-routing.js.map +1 -1
  5. package/dist/lib/linx-interactive-shell-state.js +0 -37
  6. package/dist/lib/linx-interactive-shell-state.js.map +1 -1
  7. package/dist/lib/linx-interactive-submit-router.js +1 -10
  8. package/dist/lib/linx-interactive-submit-router.js.map +1 -1
  9. package/dist/lib/linx-pod-mirror.js +55 -5
  10. package/dist/lib/linx-pod-mirror.js.map +1 -1
  11. package/dist/lib/linx-runtime-resources.js +1 -1
  12. package/dist/lib/linx-runtime-resources.js.map +1 -1
  13. package/dist/lib/linx-symphony-interactive-command.js +7 -12
  14. package/dist/lib/linx-symphony-interactive-command.js.map +1 -1
  15. package/dist/lib/symphony/run.js +166 -4
  16. package/dist/lib/symphony/run.js.map +1 -1
  17. package/dist/lib/symphony/runtime.js +7 -1
  18. package/dist/lib/symphony/runtime.js.map +1 -1
  19. package/dist/plugins/{linx-symphony-codex → linx-symphony}/.codex-plugin/plugin.json +7 -8
  20. package/dist/plugins/{linx-symphony-codex → linx-symphony}/README.md +3 -3
  21. package/dist/plugins/{linx-symphony-codex → linx-symphony}/scripts/symphony-mcp.mjs +3 -3
  22. package/dist/plugins/{linx-symphony-codex → linx-symphony}/skills/symphony/SKILL.md +39 -8
  23. package/dist/skills/capture/SKILL.md +95 -0
  24. package/dist/skills/symphony/SKILL.md +39 -8
  25. package/dist/skills/xpod-cli/SKILL.md +8 -5
  26. package/package.json +1 -1
  27. package/dist/lib/linx-interactive-idea-capture.js +0 -294
  28. package/dist/lib/linx-interactive-idea-capture.js.map +0 -1
  29. package/dist/lib/linx-interactive-turn-response-watchdog.js +0 -130
  30. package/dist/lib/linx-interactive-turn-response-watchdog.js.map +0 -1
  31. /package/dist/plugins/{linx-symphony-codex → linx-symphony}/.mcp.json +0 -0
  32. /package/dist/plugins/{linx-symphony-codex → linx-symphony}/hooks.json +0 -0
  33. /package/dist/plugins/{linx-symphony-codex → linx-symphony}/scripts/symphony-hook-events.mjs +0 -0
@@ -99,6 +99,35 @@ different WebID or Pod root than the shared Solid auth file, treat it as an
99
99
  auth-store mismatch and stop before writing. Never ask the model to handle raw
100
100
  tokens, refresh tokens, client secrets, cookies, or DPoP material directly.
101
101
 
102
+ ## Login And No-Login Behavior
103
+
104
+ No-login use is still valid. Symphony can run in portable local mode inside
105
+ LinX, Codex, Claude Code, or another agent shell without a Solid login. In that
106
+ mode it may keep local control records, Markdown/JSON notes, task briefs,
107
+ worker reports, Delivery files, and host-provided local-first outbox entries.
108
+ Those records are durable local working state, but they are not cross-device
109
+ shared authority and must not be described as saved to the user's Pod. Local
110
+ mode is not cross-device shared authority.
111
+
112
+ When the current host is LinX and shared Pod state is required, prefer the LinX
113
+ login surface: `/login` in interactive sessions or `linx login` in scriptable
114
+ sessions. LinX owns the product local-first path: before login it may record
115
+ pending control writes locally and replay them after login or auth recovery.
116
+
117
+ When the current host is Codex, Claude Code, or another external agent shell,
118
+ keep `xpod` available as the neutral Solid/Pod tool surface:
119
+
120
+ ```bash
121
+ xpod auth login
122
+ xpod auth status --json
123
+ ```
124
+
125
+ If `xpod` is unauthenticated or unavailable, continue the Symphony reasoning and
126
+ local record/report work, but state the persistence limitation when a Pod write
127
+ was requested. Do not block ordinary control-lane analysis, task splitting,
128
+ Delivery review, or follow-up extraction solely because the user has not logged
129
+ in.
130
+
102
131
  ## Agent Config And Skill Resources
103
132
 
104
133
  Do not treat an agent's backend, model, credentials, tools, or skills as hidden
@@ -313,12 +342,13 @@ lane updates Pod plus repo docs.
313
342
  Use Idea as the buffer between fragmented conversation and committed system
314
343
  work.
315
344
 
316
- Capture is a Secretary/runtime capability, not a Symphony mode switch. LinX may
317
- capture meaningful but uncommitted fragments from ordinary chat before the model
318
- turn, and Symphony consumes the resulting Idea when it is active. Capture as
319
- Ideas when the fragment describes a possible system direction, concern, product
320
- capability, modeling principle, or improvement area. Do not capture ordinary
321
- chat, games, or one-off explanations.
345
+ Capture is a Secretary/AI skill capability, not a Symphony mode switch and not a
346
+ shell keyword preflight. The active AI decides whether meaningful but
347
+ uncommitted fragments from ordinary chat should be captured, then uses the
348
+ capture skill and Pod tool surface to save them. Symphony consumes captured
349
+ Ideas when it is active. Capture as Ideas when the fragment describes a possible
350
+ system direction, concern, product capability, modeling principle, or
351
+ improvement area. Do not capture ordinary chat, games, or one-off explanations.
322
352
 
323
353
  An Idea record should stay small and explicit:
324
354
 
@@ -343,8 +373,9 @@ Promotion gates:
343
373
  - Promote to Work/Task only after implementation boundary, evidence plan, and
344
374
  blocker rules are explicit.
345
375
 
346
- Symphony may automatically capture and merge Ideas, but it must not
347
- automatically treat an Idea as committed product semantics or dispatchable work.
376
+ Symphony may decide to use the capture skill and merge Ideas, but it must not
377
+ treat keyword matches or raw chat text as committed product semantics or
378
+ dispatchable work.
348
379
  If commitment is unclear, keep it as `thought` or `candidate` and continue
349
380
  discussion.
350
381
 
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: capture
3
+ description: Use when the current AI needs to decide whether a user message contains a durable idea, decision, preference, memory, research finding, or project rule worth saving to the user's Pod. The AI decides; the shell must not pre-classify ordinary chat with keyword heuristics.
4
+ ---
5
+
6
+ # Capture
7
+
8
+ Capture is an AI judgment workflow, not a shell keyword detector.
9
+
10
+ Use this skill when the current conversation may contain something durable:
11
+
12
+ - a product or architecture idea;
13
+ - a design decision or rejected alternative;
14
+ - a user preference, personal rule, or recurring instruction;
15
+ - a research finding with provenance;
16
+ - an important project context note;
17
+ - an explicit request such as “记下来”, “保存”, “抓进 Pod”, “capture this”.
18
+
19
+ Do not capture ordinary exploratory chat, transient commands, social chatter, or
20
+ statements whose meaning is still unclear.
21
+
22
+ ## Decision Rule
23
+
24
+ The active AI decides whether to capture based on current context. Do not rely on
25
+ literal trigger words such as “是不是”, “应该”, “maybe”, or “idea” by themselves.
26
+ A capture is appropriate only when saving the statement would improve future
27
+ recall, planning, personalization, or system evolution.
28
+
29
+ When unsure, ask one concise clarification or continue the conversation without
30
+ capturing. Do not announce internal classification unless the user asked about
31
+ capture.
32
+
33
+ ## How To Write
34
+
35
+ Use `xpod` as the Pod tool surface. Prefer modeled object commands when
36
+ available. Do not hand-write Turtle for modeled product resources.
37
+
38
+ ## Login And No-Login Behavior
39
+
40
+ Prefer LinX when the current host is LinX. Use the host application's normal
41
+ Solid/LinX login flow. In LinX interactive runtime, tell the user to use
42
+ `/login` only when a real Pod write requires it. For scriptable LinX sessions,
43
+ use:
44
+
45
+ ```bash
46
+ linx login
47
+ ```
48
+
49
+ Keep `xpod` available for Codex, Claude Code, and other external agent shells.
50
+ Those hosts usually do not have the LinX runtime bridge or product local-first
51
+ outbox, so `xpod` is the direct Pod tool surface:
52
+
53
+ ```bash
54
+ xpod auth login
55
+ ```
56
+
57
+ LinX and xpod should use the same Solid authority under
58
+ `$SOLID_HOME/auth` (default `~/.solid/auth`). Do not treat old
59
+ `~/.xpod/config.json` or `~/.xpod/secrets.json` as proof of login.
60
+
61
+ Do not ask the model to handle raw tokens, refresh tokens, cookies, DPoP
62
+ material, client secrets, or copied browser session data.
63
+
64
+ No-login use is still valid. The AI may still decide what should be captured and
65
+ continue the conversation. If a durable write is required before login, use the
66
+ host's local-first capture/outbox path when available. In LinX, mark the record
67
+ as pending Pod persistence so LinX can replay it after login. In Codex/Claude
68
+ without a local-first host, keep a local note/report and state that it is not
69
+ shared to the Pod yet. Missing login must not make the AI drop a durable
70
+ decision, Idea, preference, or project rule.
71
+
72
+ Before writing, verify the Solid authority when the operation is not purely
73
+ local:
74
+
75
+ ```bash
76
+ xpod auth status --json
77
+ ```
78
+
79
+ For modeled product resources, inspect the descriptor or existing examples first:
80
+
81
+ ```bash
82
+ xpod obj --help
83
+ xpod obj export Idea --json
84
+ ```
85
+
86
+ Then write through the modeled object surface. If the current xpod version does
87
+ not expose a suitable modeled command, report the blocker instead of inventing a
88
+ path.
89
+
90
+ ## Reporting
91
+
92
+ - If captured, mention the durable summary briefly only when useful.
93
+ - If capture failed, state the persistence blocker without pretending the item
94
+ was saved.
95
+ - If not captured, answer normally; do not explain that capture was skipped.
@@ -99,6 +99,35 @@ different WebID or Pod root than the shared Solid auth file, treat it as an
99
99
  auth-store mismatch and stop before writing. Never ask the model to handle raw
100
100
  tokens, refresh tokens, client secrets, cookies, or DPoP material directly.
101
101
 
102
+ ## Login And No-Login Behavior
103
+
104
+ No-login use is still valid. Symphony can run in portable local mode inside
105
+ LinX, Codex, Claude Code, or another agent shell without a Solid login. In that
106
+ mode it may keep local control records, Markdown/JSON notes, task briefs,
107
+ worker reports, Delivery files, and host-provided local-first outbox entries.
108
+ Those records are durable local working state, but they are not cross-device
109
+ shared authority and must not be described as saved to the user's Pod. Local
110
+ mode is not cross-device shared authority.
111
+
112
+ When the current host is LinX and shared Pod state is required, prefer the LinX
113
+ login surface: `/login` in interactive sessions or `linx login` in scriptable
114
+ sessions. LinX owns the product local-first path: before login it may record
115
+ pending control writes locally and replay them after login or auth recovery.
116
+
117
+ When the current host is Codex, Claude Code, or another external agent shell,
118
+ keep `xpod` available as the neutral Solid/Pod tool surface:
119
+
120
+ ```bash
121
+ xpod auth login
122
+ xpod auth status --json
123
+ ```
124
+
125
+ If `xpod` is unauthenticated or unavailable, continue the Symphony reasoning and
126
+ local record/report work, but state the persistence limitation when a Pod write
127
+ was requested. Do not block ordinary control-lane analysis, task splitting,
128
+ Delivery review, or follow-up extraction solely because the user has not logged
129
+ in.
130
+
102
131
  ## Agent Config And Skill Resources
103
132
 
104
133
  Do not treat an agent's backend, model, credentials, tools, or skills as hidden
@@ -313,12 +342,13 @@ lane updates Pod plus repo docs.
313
342
  Use Idea as the buffer between fragmented conversation and committed system
314
343
  work.
315
344
 
316
- Capture is a Secretary/runtime capability, not a Symphony mode switch. LinX may
317
- capture meaningful but uncommitted fragments from ordinary chat before the model
318
- turn, and Symphony consumes the resulting Idea when it is active. Capture as
319
- Ideas when the fragment describes a possible system direction, concern, product
320
- capability, modeling principle, or improvement area. Do not capture ordinary
321
- chat, games, or one-off explanations.
345
+ Capture is a Secretary/AI skill capability, not a Symphony mode switch and not a
346
+ shell keyword preflight. The active AI decides whether meaningful but
347
+ uncommitted fragments from ordinary chat should be captured, then uses the
348
+ capture skill and Pod tool surface to save them. Symphony consumes captured
349
+ Ideas when it is active. Capture as Ideas when the fragment describes a possible
350
+ system direction, concern, product capability, modeling principle, or
351
+ improvement area. Do not capture ordinary chat, games, or one-off explanations.
322
352
 
323
353
  An Idea record should stay small and explicit:
324
354
 
@@ -343,8 +373,9 @@ Promotion gates:
343
373
  - Promote to Work/Task only after implementation boundary, evidence plan, and
344
374
  blocker rules are explicit.
345
375
 
346
- Symphony may automatically capture and merge Ideas, but it must not
347
- automatically treat an Idea as committed product semantics or dispatchable work.
376
+ Symphony may decide to use the capture skill and merge Ideas, but it must not
377
+ treat keyword matches or raw chat text as committed product semantics or
378
+ dispatchable work.
348
379
  If commitment is unclear, keep it as `thought` or `candidate` and continue
349
380
  discussion.
350
381
 
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: xpod-cli
3
- description: Use when LinX or Secretary needs to inspect, import, export, or update Solid Pod resources through the xpod command line; especially user-owned files, RDF resources, descriptor-backed objects, JSON output, and secret-safe operations. This skill is for using xpod CLI in product workflows, not for maintaining the xpod CLI implementation.
3
+ description: Use when an AI agent needs to inspect, import, export, or update Solid Pod resources through the xpod command line; especially user-owned files, RDF resources, descriptor-backed objects, JSON output, and secret-safe operations. This skill is for using xpod CLI in product workflows, not for maintaining the xpod CLI implementation.
4
4
  ---
5
5
 
6
6
  # Xpod CLI
7
7
 
8
- Use `xpod` as the default terminal surface for Solid Pod operations in LinX.
9
- This replaces ad-hoc `pod_read` / `pod_write` style tools: the product should
10
- prefer one shared CLI contract for Pod files, RDF resources, objects, and
11
- secrets.
8
+ Use `xpod` as the default terminal surface for Solid Pod operations when the
9
+ command is available. This replaces ad-hoc `pod_read` / `pod_write` style tools:
10
+ the product should prefer one shared CLI contract for Pod files, RDF resources,
11
+ objects, and secrets.
12
12
 
13
13
  ## When To Use
14
14
 
@@ -32,6 +32,8 @@ and maintainer-facing skill in that repository.
32
32
  `xpod head` for raw Pod resources when the user is asking about files,
33
33
  containers, or exact URLs.
34
34
  - Use `xpod rdf ...` for graph, subject, and triple-level inspection.
35
+ `xpod rdf query` requires `--sparql`; do not pass the query as a positional
36
+ argument.
35
37
  - Use `xpod secret ...` for credentials. Never print secret values by default.
36
38
  - Use `xpod server ...` only when the user asks about the local/server xpod
37
39
  process.
@@ -60,6 +62,7 @@ xpod --help
60
62
  xpod list <pod-url-or-container> --json
61
63
  xpod get <resource-url> --json
62
64
  xpod rdf subject <resource-url> --json
65
+ xpod rdf query --sparql 'SELECT * WHERE { ?s ?p ?o } LIMIT 10' --json
63
66
  xpod obj export <type-or-resource> --json
64
67
  xpod obj import <file-or-stdin> --json
65
68
  xpod obj link <source> <predicate> <target> --json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/linx",
3
- "version": "0.3.29",
3
+ "version": "0.3.31",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,294 +0,0 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { upsertExactRecord } from '@undefineds.co/drizzle-solid';
3
- import { showLinxInteractiveError } from './linx-interactive-error-display.js';
4
- import { showLinxInteractiveStatus } from './linx-interactive-status-display.js';
5
- import { DEFAULT_SECRETARY_CHAT_ID, secretaryChatUri, secretaryThreadUri } from './pod-mirror-mapping.js';
6
- import { resolveLinxInteractivePodWebId } from './linx-interactive-runtime-host.js';
7
- import { resolveLinxSessionId } from './linx-session-metadata.js';
8
- import { registerLinxInteractiveSubmitHandler } from './linx-interactive-submit-router.js';
9
- import { getDefaultPodDataSession } from './pod-data-session.js';
10
- import { getLinxInteractiveCaptureIdea, getLinxInteractiveIdeaCaptureForegroundTimeoutMs, setLinxInteractiveLastIdeaCapture, } from './linx-interactive-shell-state.js';
11
- import { chatResource, drizzle, ideaResource, solidResources, threadResource, } from './models.js';
12
- const ideaCaptureInstalled = new WeakSet();
13
- const DEFAULT_IDEA_CAPTURE_FOREGROUND_TIMEOUT_MS = 1_500;
14
- export function installLinxInteractiveIdeaCapture(interactive, runtime) {
15
- if (!interactive || ideaCaptureInstalled.has(interactive)) {
16
- return;
17
- }
18
- registerLinxInteractiveSubmitHandler(interactive, {
19
- name: 'linx-idea-capture',
20
- priority: 10,
21
- async handler({ interactive: target, input }) {
22
- if (!shouldConsiderIdeaCaptureInput(input) || !shouldCaptureIdeaInput(input)) {
23
- return false;
24
- }
25
- showLinxInteractiveStatus(target, 'Capturing Idea…');
26
- const capture = captureInteractiveIdeaForInput(target, runtime, input);
27
- const projection = await waitForForegroundIdeaCapture(capture, resolveIdeaCaptureForegroundTimeoutMs(target));
28
- setLinxInteractiveLastIdeaCapture(target, input, projection);
29
- if (projection?.kind === 'pending') {
30
- showLinxInteractiveStatus(target, 'Idea capture is still running; continuing chat.');
31
- void capture.catch((error) => {
32
- const normalized = normalizeError(error);
33
- showLinxInteractiveError(target, `Capture failed: ${normalized.message}`);
34
- });
35
- }
36
- return false;
37
- },
38
- });
39
- ideaCaptureInstalled.add(interactive);
40
- }
41
- function resolveIdeaCaptureForegroundTimeoutMs(interactive) {
42
- const configured = getLinxInteractiveIdeaCaptureForegroundTimeoutMs(interactive);
43
- return typeof configured === 'number' && Number.isFinite(configured) && configured >= 0
44
- ? configured
45
- : DEFAULT_IDEA_CAPTURE_FOREGROUND_TIMEOUT_MS;
46
- }
47
- async function waitForForegroundIdeaCapture(capture, timeoutMs) {
48
- let timeout;
49
- try {
50
- return await Promise.race([
51
- capture,
52
- new Promise((resolve) => {
53
- timeout = setTimeout(() => {
54
- resolve({ kind: 'pending', message: 'Idea capture is still running downstream.' });
55
- }, timeoutMs);
56
- }),
57
- ]);
58
- }
59
- finally {
60
- if (timeout) {
61
- clearTimeout(timeout);
62
- }
63
- }
64
- }
65
- export async function captureInteractiveIdeaForInput(interactive, runtime, input, options = {}) {
66
- try {
67
- const source = await resolveIdeaSourceContext(interactive, runtime);
68
- const context = await captureIdeaIfNeeded(input, source, getLinxInteractiveCaptureIdea(interactive), options.podRuntime);
69
- if (!context) {
70
- return undefined;
71
- }
72
- showLinxInteractiveStatus(interactive, `Captured Idea: ${context.summary} (${context.status}).`);
73
- return { kind: 'captured', context };
74
- }
75
- catch (error) {
76
- const normalized = normalizeError(error);
77
- showLinxInteractiveError(interactive, `Capture failed: ${normalized.message}`);
78
- return { kind: 'failed', error: normalized };
79
- }
80
- }
81
- export function renderIdeaCaptureProjection(ideaCapture) {
82
- if (!ideaCapture) {
83
- return [];
84
- }
85
- if (ideaCapture.kind === 'captured') {
86
- return [
87
- '',
88
- 'Capture status:',
89
- 'Idea already captured before this model turn.',
90
- `URI: ${ideaCapture.context.uri}`,
91
- `Summary: ${ideaCapture.context.summary}`,
92
- `Status: ${ideaCapture.context.status}`,
93
- `Commitment: ${ideaCapture.context.commitment}`,
94
- 'Do not ask the user to repeat this capture and do not claim capture is still pending.',
95
- ];
96
- }
97
- if (ideaCapture.kind === 'pending') {
98
- return [
99
- '',
100
- 'Capture status:',
101
- 'Idea capture started before this model turn but is still waiting on a downstream Pod call.',
102
- `Status: ${ideaCapture.message}`,
103
- 'Do not claim it was captured yet. Continue the answer normally and mention the pending capture only if relevant.',
104
- ];
105
- }
106
- return [
107
- '',
108
- 'Capture status:',
109
- 'Idea capture was required but Pod write failed before this model turn.',
110
- `Error: ${ideaCapture.error.message}`,
111
- 'Do not claim it was captured. Surface the persistence blocker briefly if the user-facing answer would otherwise imply durable capture.',
112
- ];
113
- }
114
- export function serializeIdeaCaptureProjection(ideaCapture) {
115
- if (ideaCapture.kind === 'captured') {
116
- return {
117
- kind: 'captured',
118
- ...ideaCapture.context,
119
- };
120
- }
121
- if (ideaCapture.kind === 'pending') {
122
- return {
123
- kind: 'pending',
124
- message: ideaCapture.message,
125
- };
126
- }
127
- return {
128
- kind: 'failed',
129
- message: ideaCapture.error.message,
130
- };
131
- }
132
- function shouldConsiderIdeaCaptureInput(input) {
133
- return Boolean(input)
134
- && !input.startsWith('/')
135
- && !input.startsWith('!');
136
- }
137
- async function captureIdeaIfNeeded(input, source, captureIdea, runtime) {
138
- if (!shouldCaptureIdeaInput(input)) {
139
- return undefined;
140
- }
141
- if (captureIdea) {
142
- return normalizeCapturedIdeaContext(await captureIdea(input, source));
143
- }
144
- return persistCapturedIdeaToPod({
145
- input,
146
- source,
147
- affectedArea: inferIdeaAffectedArea(input),
148
- runtime,
149
- });
150
- }
151
- async function persistCapturedIdeaToPod(input) {
152
- const runtime = input.runtime ?? createDefaultIdeaCaptureRuntime();
153
- const podSession = await runtime.getPodDataSession();
154
- if (!podSession) {
155
- throw new Error('No active Pod session; Idea capture requires LinX/Solid login.');
156
- }
157
- const db = runtime.createDb(podSession);
158
- const now = new Date();
159
- const row = buildCapturedIdeaRow({
160
- input: input.input,
161
- source: input.source,
162
- webId: podSession.webId,
163
- now,
164
- affectedArea: input.affectedArea,
165
- });
166
- await db.init([
167
- runtime.ideaResource,
168
- runtime.chatResource,
169
- runtime.threadResource,
170
- ]).catch(() => undefined);
171
- await upsertExactRecord(db, runtime.ideaResource, { id: row.id }, row, {
172
- operation: 'linx.capture.idea.upsert',
173
- });
174
- return {
175
- uri: runtime.ideaResource.buildIri(podSession.webId, { id: row.id, createdAt: row.createdAt }),
176
- summary: row.summary,
177
- status: row.status,
178
- commitment: row.commitment,
179
- };
180
- }
181
- function createDefaultIdeaCaptureRuntime() {
182
- return {
183
- getPodDataSession: getDefaultPodDataSession,
184
- createDb(podSession) {
185
- return drizzle(podSession.solidSession, {
186
- logger: false,
187
- disableInteropDiscovery: true,
188
- podUrl: podSession.podUrl,
189
- resourcePreparation: 'best-effort',
190
- schema: solidResources,
191
- });
192
- },
193
- ideaResource,
194
- chatResource,
195
- threadResource,
196
- };
197
- }
198
- function buildCapturedIdeaRow(input) {
199
- const text = input.input.trim();
200
- const summary = summarizeIdeaInput(text);
201
- const id = buildIdeaResourceId(input.now);
202
- return {
203
- id,
204
- summary,
205
- input: text,
206
- status: 'captured',
207
- commitment: 'thought',
208
- affectedArea: input.affectedArea,
209
- currentUnderstanding: text,
210
- openQuestions: [],
211
- related: [],
212
- conflicts: [],
213
- nextStep: 'Review this captured Idea against related conversation and promote only after scope and commitment are clear.',
214
- chat: input.source?.chat,
215
- thread: input.source?.thread,
216
- sourceMessages: [],
217
- createdBy: input.webId,
218
- metadata: {
219
- surface: 'linx-capture',
220
- source: 'interactive-user-message',
221
- ...(input.source?.sessionId ? { sessionId: input.source.sessionId } : {}),
222
- },
223
- createdAt: input.now,
224
- updatedAt: input.now,
225
- };
226
- }
227
- function buildIdeaResourceId(now) {
228
- const yyyy = String(now.getUTCFullYear()).padStart(4, '0');
229
- const mm = String(now.getUTCMonth() + 1).padStart(2, '0');
230
- const dd = String(now.getUTCDate()).padStart(2, '0');
231
- return `${yyyy}/${mm}/${dd}.ttl#idea_${now.toISOString().replace(/[-:.TZ]/g, '')}_${randomUUID().slice(0, 8)}`;
232
- }
233
- function shouldCaptureIdeaInput(input) {
234
- const normalized = input.trim();
235
- if (normalized.length < 12) {
236
- return false;
237
- }
238
- return /\b(idea|maybe|perhaps|could we|should we|what if|proposal|direction)\b/iu.test(normalized)
239
- || /(我觉得|感觉|也许|可能|考虑|想法|方向|要不要|能不能|是不是|是否|应该)/u.test(normalized);
240
- }
241
- function inferIdeaAffectedArea(input) {
242
- const normalized = input.toLowerCase();
243
- if (/symphony|secretary|auto|approval|grant|pod|xpod|skill|worker|agent|capture/u.test(normalized)) {
244
- return normalized.match(/symphony|secretary|auto|approval|grant|pod|xpod|skill|worker|agent|capture/u)?.[0];
245
- }
246
- if (/(建模|模型|数据|同步|权限|审批|托管|多端|工作流|指标|质检|抓取|收藏|记忆)/u.test(input)) {
247
- return input.match(/建模|模型|数据|同步|权限|审批|托管|多端|工作流|指标|质检|抓取|收藏|记忆/u)?.[0];
248
- }
249
- return undefined;
250
- }
251
- function summarizeIdeaInput(input) {
252
- const normalized = input.replace(/\s+/g, ' ').trim();
253
- return normalized.length <= 80 ? normalized : `${normalized.slice(0, 77)}...`;
254
- }
255
- function normalizeCapturedIdeaContext(value) {
256
- if (!isRecord(value)) {
257
- return undefined;
258
- }
259
- const uri = normalizeString(value.uri);
260
- const summary = normalizeString(value.summary);
261
- if (!uri || !summary) {
262
- return undefined;
263
- }
264
- return {
265
- uri,
266
- summary,
267
- status: normalizeString(value.status) ?? 'captured',
268
- commitment: normalizeString(value.commitment) ?? 'thought',
269
- };
270
- }
271
- async function resolveIdeaSourceContext(interactive, runtime) {
272
- const sessionId = resolveLinxSessionId({ interactive, runtime });
273
- const webId = await resolveLinxInteractivePodWebId(interactive);
274
- if (typeof sessionId !== 'string' || !sessionId.trim() || !webId) {
275
- return undefined;
276
- }
277
- const trimmedSessionId = sessionId.trim();
278
- return {
279
- chat: secretaryChatUri(webId),
280
- thread: secretaryThreadUri(webId, trimmedSessionId, DEFAULT_SECRETARY_CHAT_ID),
281
- sessionId: trimmedSessionId,
282
- };
283
- }
284
- function normalizeString(value) {
285
- const normalized = typeof value === 'string' ? value.trim() : '';
286
- return normalized || undefined;
287
- }
288
- function normalizeError(error) {
289
- return error instanceof Error ? error : new Error(String(error));
290
- }
291
- function isRecord(value) {
292
- return Boolean(value) && typeof value === 'object';
293
- }
294
- //# sourceMappingURL=linx-interactive-idea-capture.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"linx-interactive-idea-capture.js","sourceRoot":"","sources":["../../src/lib/linx-interactive-idea-capture.ts"],"names":[],"mappings":"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"}