@undefineds.co/linx 0.2.15 → 0.2.16

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 (41) hide show
  1. package/README.md +3 -6
  2. package/dist/index.js +50 -104
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/ai-command.js +38 -60
  5. package/dist/lib/ai-command.js.map +1 -1
  6. package/dist/lib/pi-adapter/branding.js +2 -2
  7. package/dist/lib/pi-adapter/branding.js.map +1 -1
  8. package/dist/lib/pi-adapter/pod-native.js +3 -2
  9. package/dist/lib/pi-adapter/pod-native.js.map +1 -1
  10. package/dist/lib/pi-adapter/runtime.js +2 -2
  11. package/dist/lib/pi-adapter/runtime.js.map +1 -1
  12. package/dist/lib/pod-data-session.js +43 -3
  13. package/dist/lib/pod-data-session.js.map +1 -1
  14. package/dist/lib/watch/hooks/claude.js +4 -0
  15. package/dist/lib/watch/hooks/claude.js.map +1 -1
  16. package/dist/lib/watch/hooks/codebuddy.js +4 -0
  17. package/dist/lib/watch/hooks/codebuddy.js.map +1 -1
  18. package/dist/lib/watch/hooks/codex.js +4 -0
  19. package/dist/lib/watch/hooks/codex.js.map +1 -1
  20. package/dist/lib/watch/pod-ai.js +22 -14
  21. package/dist/lib/watch/pod-ai.js.map +1 -1
  22. package/dist/lib/watch/pod-approval.js +387 -35
  23. package/dist/lib/watch/pod-approval.js.map +1 -1
  24. package/dist/lib/watch/pod-persistence.js +162 -43
  25. package/dist/lib/watch/pod-persistence.js.map +1 -1
  26. package/dist/lib/watch/runner.js +240 -38
  27. package/dist/lib/watch/runner.js.map +1 -1
  28. package/dist/lib/watch/secretary.js +238 -0
  29. package/dist/lib/watch/secretary.js.map +1 -0
  30. package/dist/watch-cli.js +8 -34
  31. package/dist/watch-cli.js.map +1 -1
  32. package/package.json +3 -2
  33. package/vendor/agent-runtime/dist/acp.d.ts +27 -0
  34. package/vendor/agent-runtime/dist/acp.js +86 -0
  35. package/vendor/agent-runtime/dist/companion-model.d.ts +7 -0
  36. package/vendor/agent-runtime/dist/companion-model.js +12 -0
  37. package/vendor/agent-runtime/dist/index.d.ts +3 -0
  38. package/vendor/agent-runtime/dist/index.js +3 -0
  39. package/vendor/agent-runtime/dist/turn-controller.d.ts +69 -0
  40. package/vendor/agent-runtime/dist/turn-controller.js +129 -0
  41. package/vendor/agent-runtime/package.json +11 -0
@@ -0,0 +1,238 @@
1
+ import { createFallbackWatchSecretaryRecommendation, parseWatchGrantCoverageDecision, parseWatchSecretaryRecommendation, } from '@undefineds.co/models/watch';
2
+ import { createRemoteCompletionResult } from '../chat-api.js';
3
+ import { DEFAULT_LINX_CLOUD_MODEL_ID } from '../default-model.js';
4
+ import { getDefaultPodDataSession } from '../pod-data-session.js';
5
+ import { resolveRuntimeTarget } from '../runtime-target.js';
6
+ const SECRETARY_MODEL = DEFAULT_LINX_CLOUD_MODEL_ID;
7
+ const SECRETARY_TIMEOUT_MS = 15_000;
8
+ export async function resolveWatchSecretaryRecommendation(input) {
9
+ if (input.mode === 'manual') {
10
+ return null;
11
+ }
12
+ try {
13
+ const session = await getDefaultPodDataSession();
14
+ if (!session) {
15
+ return createFallbackWatchSecretaryRecommendation(input);
16
+ }
17
+ const target = resolveRuntimeTarget({ issuerUrl: session.credentials.url });
18
+ const apiKey = await session.getRuntimeAuthToken();
19
+ const result = await createRemoteCompletionResult({
20
+ runtimeUrl: target.runtimeUrl,
21
+ apiKey,
22
+ model: SECRETARY_MODEL,
23
+ messages: [
24
+ {
25
+ role: 'system',
26
+ content: [
27
+ 'You are the LinX AI secretary for tool approvals and structured user-input requests.',
28
+ 'Return strict JSON only.',
29
+ 'For approvals, choose canAutoDecide=true only when the request is clearly safe, reversible, and sufficiently contextualized.',
30
+ 'For approvals, decision must be one of "accept", "decline", or "cancel". Never recommend grant, allow_always, accept_for_session, session approval, or long-term authorization.',
31
+ 'LinX derives the reaction window from confidence and caps it at 60 seconds; do not rely on a model-provided reactionWindowMs.',
32
+ 'Use canAutoDecide=false when the command is destructive, writes outside the workspace, exposes secrets, changes credentials, installs packages, makes network side effects, or lacks context.',
33
+ 'For user-input requests, answer only when the answer can be inferred from the provided context. Do not invent secrets, tokens, paths, or user preferences.',
34
+ 'Schema for approval: {"canAutoDecide":boolean,"decision":"accept|decline|cancel","confidence":0..1,"reason":"short"}.',
35
+ 'Schema for user-input: {"canAutoDecide":boolean,"answers":{"question_id":{"answers":["value"]}},"confidence":0..1,"reason":"short"}.',
36
+ ].join(' '),
37
+ },
38
+ {
39
+ role: 'user',
40
+ content: JSON.stringify(buildSecretaryPayload(input)),
41
+ },
42
+ ],
43
+ signal: AbortSignal.timeout(SECRETARY_TIMEOUT_MS),
44
+ });
45
+ return parseWatchSecretaryRecommendation(result.content, {
46
+ mode: input.mode,
47
+ request: input.request,
48
+ }) ?? createFallbackWatchSecretaryRecommendation(input);
49
+ }
50
+ catch {
51
+ return createFallbackWatchSecretaryRecommendation(input);
52
+ }
53
+ }
54
+ export async function resolveWatchGrantCoverage(input) {
55
+ if (!hasSemanticGrantPage(input.grant)) {
56
+ return {
57
+ covers: false,
58
+ reason: 'Grant has no semantic wiki page.',
59
+ source: 'fallback',
60
+ };
61
+ }
62
+ try {
63
+ const session = await getDefaultPodDataSession();
64
+ if (!session) {
65
+ return {
66
+ covers: false,
67
+ reason: 'AI secretary is unavailable for semantic grant evaluation.',
68
+ source: 'fallback',
69
+ };
70
+ }
71
+ const target = resolveRuntimeTarget({ issuerUrl: session.credentials.url });
72
+ const apiKey = await session.getRuntimeAuthToken();
73
+ const result = await createRemoteCompletionResult({
74
+ runtimeUrl: target.runtimeUrl,
75
+ apiKey,
76
+ model: SECRETARY_MODEL,
77
+ messages: [
78
+ {
79
+ role: 'system',
80
+ content: [
81
+ 'You are the LinX AI secretary evaluating whether an existing delegation grant covers a new approval request.',
82
+ 'Return strict JSON only.',
83
+ 'A grant is an LLM Wiki page, not a string pattern. Use covers=true only after reading the page body, summary, tags, provenance, and context, and only when the current request clearly fits the documented semantics.',
84
+ 'Use covers=false when the request changes from read-only to write/destructive behavior, touches credentials/secrets, installs packages, makes new network side effects, changes workspace boundaries, or the wiki page is ambiguous.',
85
+ 'Schema: {"covers":boolean,"confidence":0..1,"reason":"short"}.',
86
+ ].join(' '),
87
+ },
88
+ {
89
+ role: 'user',
90
+ content: JSON.stringify(buildGrantCoveragePayload(input)),
91
+ },
92
+ ],
93
+ signal: AbortSignal.timeout(SECRETARY_TIMEOUT_MS),
94
+ });
95
+ return parseWatchGrantCoverageDecision(result.content) ?? {
96
+ covers: false,
97
+ reason: 'AI secretary returned an invalid grant coverage decision.',
98
+ source: 'fallback',
99
+ };
100
+ }
101
+ catch {
102
+ return {
103
+ covers: false,
104
+ reason: 'AI secretary failed during semantic grant evaluation.',
105
+ source: 'fallback',
106
+ };
107
+ }
108
+ }
109
+ function buildSecretaryPayload(input) {
110
+ return {
111
+ mode: input.mode,
112
+ session: {
113
+ id: input.record.id,
114
+ backend: input.record.backend,
115
+ cwd: input.record.cwd,
116
+ model: input.record.model,
117
+ credentialSource: input.record.resolvedCredentialSource ?? input.record.credentialSource,
118
+ approvalSource: input.record.approvalSource,
119
+ },
120
+ request: summarizeRequest(input.request),
121
+ };
122
+ }
123
+ function hasSemanticGrantPage(grant) {
124
+ return typeof grant.body === 'string' && grant.body.trim().length > 0
125
+ || typeof grant.policy === 'string' && grant.policy.trim().length > 0;
126
+ }
127
+ function buildGrantCoveragePayload(input) {
128
+ return {
129
+ session: input.record ? {
130
+ id: input.record.id,
131
+ backend: input.record.backend,
132
+ cwd: input.record.cwd,
133
+ model: input.record.model,
134
+ credentialSource: input.record.resolvedCredentialSource ?? input.record.credentialSource,
135
+ approvalSource: input.record.approvalSource,
136
+ } : undefined,
137
+ grant: summarizeGrant(input.grant),
138
+ currentRequest: summarizeCoverageRequest(input.request),
139
+ requestContext: input.requestContext,
140
+ };
141
+ }
142
+ function summarizeGrant(grant) {
143
+ return {
144
+ target: grant.target,
145
+ action: grant.action,
146
+ title: grant.title,
147
+ summary: grant.summary,
148
+ body: grant.body,
149
+ schema: grant.schema,
150
+ pageKind: grant.pageKind,
151
+ wikiStatus: grant.wikiStatus,
152
+ tags: parseJsonString(grant.tags) ?? grant.tags,
153
+ source: grant.source,
154
+ sourceHash: grant.sourceHash,
155
+ compiledAt: grant.compiledAt,
156
+ compiledFrom: grant.compiledFrom,
157
+ related: grant.related,
158
+ effect: grant.effect,
159
+ riskCeiling: grant.riskCeiling,
160
+ policy: grant.policy,
161
+ context: parseJsonString(grant.context) ?? grant.context,
162
+ decisionRole: grant.decisionRole,
163
+ createdAt: grant.createdAt,
164
+ };
165
+ }
166
+ function summarizeCoverageRequest(request) {
167
+ if ('kind' in request && request.kind === 'command-approval') {
168
+ return {
169
+ kind: request.kind,
170
+ message: request.message,
171
+ command: request.command,
172
+ cwd: request.cwd,
173
+ approvalOptions: request.approvalOptions,
174
+ expiresAt: request.expiresAt,
175
+ };
176
+ }
177
+ if ('kind' in request && request.kind === 'permissions-approval') {
178
+ return {
179
+ kind: request.kind,
180
+ message: request.message,
181
+ permissions: request.permissions,
182
+ approvalOptions: request.approvalOptions,
183
+ expiresAt: request.expiresAt,
184
+ };
185
+ }
186
+ return { ...request };
187
+ }
188
+ function parseJsonString(value) {
189
+ if (typeof value !== 'string' || !value.trim()) {
190
+ return undefined;
191
+ }
192
+ try {
193
+ return JSON.parse(value);
194
+ }
195
+ catch {
196
+ return undefined;
197
+ }
198
+ }
199
+ function summarizeRequest(request) {
200
+ if (request.kind === 'user-input') {
201
+ return {
202
+ kind: request.kind,
203
+ message: request.message,
204
+ questions: request.questions.map((question) => ({
205
+ id: question.id,
206
+ header: question.header,
207
+ question: question.question,
208
+ options: question.options,
209
+ })),
210
+ };
211
+ }
212
+ if (request.kind === 'command-approval') {
213
+ return {
214
+ kind: request.kind,
215
+ message: request.message,
216
+ command: request.command,
217
+ cwd: request.cwd,
218
+ approvalOptions: request.approvalOptions,
219
+ expiresAt: request.expiresAt,
220
+ };
221
+ }
222
+ if (request.kind === 'permissions-approval') {
223
+ return {
224
+ kind: request.kind,
225
+ message: request.message,
226
+ permissions: request.permissions,
227
+ approvalOptions: request.approvalOptions,
228
+ expiresAt: request.expiresAt,
229
+ };
230
+ }
231
+ return {
232
+ kind: request.kind,
233
+ message: request.message,
234
+ approvalOptions: request.approvalOptions,
235
+ expiresAt: request.expiresAt,
236
+ };
237
+ }
238
+ //# sourceMappingURL=secretary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretary.js","sourceRoot":"","sources":["../../../src/lib/watch/secretary.ts"],"names":[],"mappings":"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"}
package/dist/watch-cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import yargs from 'yargs';
3
3
  import { hideBin } from 'yargs/helpers';
4
- import { formatRemoteWatchApprovalSummary, formatArchivedWatchSession, formatWatchSessionSummary, loadArchivedWatchEvents, listArchivedWatchSessions, listRemoteWatchApprovals, listSupportedWatchBackends, loadArchivedWatchSession, resolveRemoteWatchApproval, runWatch, } from './lib/watch/index.js';
4
+ import { formatArchivedWatchSession, formatWatchSessionSummary, loadArchivedWatchEvents, listArchivedWatchSessions, listSupportedWatchBackends, loadArchivedWatchSession, runWatch, } from './lib/watch/index.js';
5
5
  const cli = yargs(hideBin(process.argv))
6
6
  .scriptName('linx watch')
7
7
  .parserConfiguration({
@@ -10,11 +10,11 @@ const cli = yargs(hideBin(process.argv))
10
10
  .command('$0 <action> [backend] [prompt..]', 'Run or inspect local watch backends', (command) => command
11
11
  .positional('action', {
12
12
  type: 'string',
13
- choices: ['run', 'backends', 'sessions', 'show', 'approvals', 'approve', 'reject', 'codex', 'claude', 'codebuddy'],
13
+ choices: ['run', 'backends', 'sessions', 'show', 'codex', 'claude', 'codebuddy'],
14
14
  })
15
15
  .positional('backend', {
16
16
  type: 'string',
17
- describe: 'Watch backend for `run`, session id for `show`, or approval id for `approve|reject`',
17
+ describe: 'Watch backend for `run` or session id for `show`',
18
18
  })
19
19
  .option('mode', {
20
20
  type: 'string',
@@ -41,14 +41,11 @@ const cli = yargs(hideBin(process.argv))
41
41
  choices: ['auto', 'local', 'cloud'],
42
42
  describe: 'Resolve credentials only: local CLI login, LinX cloud config, or auto fallback. Runtime still runs locally.',
43
43
  })
44
- .option('session', {
45
- type: 'boolean',
46
- default: false,
47
- describe: 'Approve for the current watch session instead of only once.',
48
- })
49
- .option('reason', {
44
+ .option('approval-source', {
50
45
  type: 'string',
51
- describe: 'Optional note recorded with an approval decision.',
46
+ default: 'hybrid',
47
+ choices: ['local', 'remote', 'hybrid'],
48
+ describe: 'Resolve backend approval requests locally, through Pod remote approvals, or whichever answers first.',
52
49
  }), async (argv) => {
53
50
  const rawAction = String(argv.action);
54
51
  const directBackend = ['codex', 'claude', 'codebuddy'].includes(rawAction);
@@ -85,30 +82,6 @@ const cli = yargs(hideBin(process.argv))
85
82
  process.stdout.write(formatArchivedWatchSession(session, loadArchivedWatchEvents(sessionId)));
86
83
  return;
87
84
  }
88
- if (action === 'approvals') {
89
- const approvals = await listRemoteWatchApprovals();
90
- if (approvals.length === 0) {
91
- process.stdout.write('No pending remote approvals in the approval inbox.\n');
92
- return;
93
- }
94
- process.stdout.write(`${approvals.map(formatRemoteWatchApprovalSummary).join('\n')}\n`);
95
- return;
96
- }
97
- if (action === 'approve' || action === 'reject') {
98
- const approvalId = argv.backend ? String(argv.backend) : '';
99
- if (!approvalId) {
100
- throw new Error(`Usage: linx watch ${action} <approvalId>`);
101
- }
102
- const summary = await resolveRemoteWatchApproval({
103
- approvalId,
104
- decision: action === 'approve'
105
- ? (argv.session ? 'accept_for_session' : 'accept')
106
- : 'decline',
107
- note: argv.reason ? String(argv.reason) : undefined,
108
- });
109
- process.stdout.write(`${formatRemoteWatchApprovalSummary(summary)}\n`);
110
- return;
111
- }
112
85
  const backend = (directBackend ? rawAction : argv.backend);
113
86
  if (!backend || !['codex', 'claude', 'codebuddy'].includes(backend)) {
114
87
  throw new Error('Usage: linx watch run <codex|claude|codebuddy> <prompt> [-- backend args]\n or: linx watch <codex|claude|codebuddy> <prompt>');
@@ -127,6 +100,7 @@ const cli = yargs(hideBin(process.argv))
127
100
  prompt,
128
101
  passthroughArgs: (argv['--'] ?? []).map(String),
129
102
  credentialSource: argv['credential-source'],
103
+ approvalSource: argv['approval-source'],
130
104
  });
131
105
  if (exitCode !== 0) {
132
106
  process.exitCode = exitCode;
@@ -1 +1 @@
1
- {"version":3,"file":"watch-cli.js","sourceRoot":"","sources":["../src/watch-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch-cli.js","sourceRoot":"","sources":["../src/watch-cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/linx",
3
- "version": "0.2.15",
3
+ "version": "0.2.16",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -12,7 +12,7 @@
12
12
  "test": "yarn build && node --test test/**/*.test.mjs"
13
13
  },
14
14
  "dependencies": {
15
- "@undefineds.co/models": "0.2.15",
15
+ "@undefineds.co/models": "0.2.16",
16
16
  "@inrupt/solid-client-authn-node": "^3.1.1",
17
17
  "@mariozechner/pi-coding-agent": "^0.67.6",
18
18
  "n3": "^1.26.0",
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "files": [
27
27
  "dist",
28
+ "vendor",
28
29
  "README.md",
29
30
  "package.json"
30
31
  ],
@@ -0,0 +1,27 @@
1
+ export type AgentRuntimeProtocol = 'acp' | 'linx-chatkit' | 'linx-cloud' | 'custom';
2
+ export type AgentRuntimeCapabilityName = 'session.start' | 'session.resume' | 'message.send' | 'message.receive' | 'message.stream' | 'message.thinking' | 'message.inject' | 'tool.call' | 'approval.request' | 'approval.options' | 'input.structured' | 'control.interrupt' | 'control.pause' | 'control.resume' | 'control.stop' | 'model.set';
3
+ export interface AgentRuntimeCapabilities {
4
+ protocol: AgentRuntimeProtocol;
5
+ canStartSession: boolean;
6
+ canResumeSession: boolean;
7
+ canSendMessage: boolean;
8
+ canReceiveEvents: boolean;
9
+ hasStreaming: boolean;
10
+ hasThinking: boolean;
11
+ hasToolCalls: boolean;
12
+ hasApprovals: boolean;
13
+ hasApprovalOptions: boolean;
14
+ hasStructuredUserInput: boolean;
15
+ canInterrupt: boolean;
16
+ canInjectMessage: boolean;
17
+ canPause: boolean;
18
+ canResume: boolean;
19
+ canStop: boolean;
20
+ canSetModel: boolean;
21
+ }
22
+ export declare const BASE_ACP_AGENT_CAPABILITIES: AgentRuntimeCapabilities;
23
+ export declare const DEFAULT_LINX_CHATKIT_AGENT_CAPABILITIES: AgentRuntimeCapabilities;
24
+ export declare function defineAgentRuntimeCapabilities(base: AgentRuntimeCapabilities, overrides?: Partial<AgentRuntimeCapabilities>): AgentRuntimeCapabilities;
25
+ export declare function createAcpAgentCapabilities(overrides?: Partial<AgentRuntimeCapabilities>): AgentRuntimeCapabilities;
26
+ export declare function createLinxChatKitAgentCapabilities(overrides?: Partial<AgentRuntimeCapabilities>): AgentRuntimeCapabilities;
27
+ export declare function supportsAgentRuntimeCapability(capabilities: AgentRuntimeCapabilities, capability: AgentRuntimeCapabilityName): boolean;
@@ -0,0 +1,86 @@
1
+ export const BASE_ACP_AGENT_CAPABILITIES = {
2
+ protocol: 'acp',
3
+ canStartSession: true,
4
+ canResumeSession: false,
5
+ canSendMessage: true,
6
+ canReceiveEvents: true,
7
+ hasStreaming: true,
8
+ hasThinking: false,
9
+ hasToolCalls: true,
10
+ hasApprovals: true,
11
+ hasApprovalOptions: true,
12
+ hasStructuredUserInput: true,
13
+ canInterrupt: false,
14
+ canInjectMessage: false,
15
+ canPause: false,
16
+ canResume: false,
17
+ canStop: true,
18
+ canSetModel: false,
19
+ };
20
+ export const DEFAULT_LINX_CHATKIT_AGENT_CAPABILITIES = {
21
+ protocol: 'linx-chatkit',
22
+ canStartSession: true,
23
+ canResumeSession: true,
24
+ canSendMessage: true,
25
+ canReceiveEvents: true,
26
+ hasStreaming: true,
27
+ hasThinking: true,
28
+ hasToolCalls: true,
29
+ hasApprovals: true,
30
+ hasApprovalOptions: true,
31
+ hasStructuredUserInput: true,
32
+ canInterrupt: true,
33
+ canInjectMessage: true,
34
+ canPause: false,
35
+ canResume: false,
36
+ canStop: true,
37
+ canSetModel: true,
38
+ };
39
+ export function defineAgentRuntimeCapabilities(base, overrides = {}) {
40
+ return {
41
+ ...base,
42
+ ...overrides,
43
+ };
44
+ }
45
+ export function createAcpAgentCapabilities(overrides = {}) {
46
+ return defineAgentRuntimeCapabilities(BASE_ACP_AGENT_CAPABILITIES, overrides);
47
+ }
48
+ export function createLinxChatKitAgentCapabilities(overrides = {}) {
49
+ return defineAgentRuntimeCapabilities(DEFAULT_LINX_CHATKIT_AGENT_CAPABILITIES, overrides);
50
+ }
51
+ export function supportsAgentRuntimeCapability(capabilities, capability) {
52
+ switch (capability) {
53
+ case 'session.start':
54
+ return capabilities.canStartSession;
55
+ case 'session.resume':
56
+ return capabilities.canResumeSession;
57
+ case 'message.send':
58
+ return capabilities.canSendMessage;
59
+ case 'message.receive':
60
+ return capabilities.canReceiveEvents;
61
+ case 'message.stream':
62
+ return capabilities.hasStreaming;
63
+ case 'message.thinking':
64
+ return capabilities.hasThinking;
65
+ case 'message.inject':
66
+ return capabilities.canInjectMessage;
67
+ case 'tool.call':
68
+ return capabilities.hasToolCalls;
69
+ case 'approval.request':
70
+ return capabilities.hasApprovals;
71
+ case 'approval.options':
72
+ return capabilities.hasApprovalOptions;
73
+ case 'input.structured':
74
+ return capabilities.hasStructuredUserInput;
75
+ case 'control.interrupt':
76
+ return capabilities.canInterrupt;
77
+ case 'control.pause':
78
+ return capabilities.canPause;
79
+ case 'control.resume':
80
+ return capabilities.canResume;
81
+ case 'control.stop':
82
+ return capabilities.canStop;
83
+ case 'model.set':
84
+ return capabilities.canSetModel;
85
+ }
86
+ }
@@ -0,0 +1,7 @@
1
+ export type AgentRuntimeCompanionTask = 'turn.route' | 'approval.judge' | 'input.answer' | 'context.summarize' | 'title.generate' | 'retrieval.rank';
2
+ export declare const DEFAULT_AGENT_RUNTIME_COMPANION_MODEL_ID = "linx-lite";
3
+ export interface AgentRuntimeCompanionModelPolicy {
4
+ modelId: string;
5
+ tasks: AgentRuntimeCompanionTask[];
6
+ }
7
+ export declare const DEFAULT_AGENT_RUNTIME_COMPANION_MODEL_POLICY: AgentRuntimeCompanionModelPolicy;
@@ -0,0 +1,12 @@
1
+ export const DEFAULT_AGENT_RUNTIME_COMPANION_MODEL_ID = 'linx-lite';
2
+ export const DEFAULT_AGENT_RUNTIME_COMPANION_MODEL_POLICY = {
3
+ modelId: DEFAULT_AGENT_RUNTIME_COMPANION_MODEL_ID,
4
+ tasks: [
5
+ 'turn.route',
6
+ 'approval.judge',
7
+ 'input.answer',
8
+ 'context.summarize',
9
+ 'title.generate',
10
+ 'retrieval.rank',
11
+ ],
12
+ };
@@ -0,0 +1,3 @@
1
+ export * from './acp.js';
2
+ export * from './companion-model.js';
3
+ export * from './turn-controller.js';
@@ -0,0 +1,3 @@
1
+ export * from './acp.js';
2
+ export * from './companion-model.js';
3
+ export * from './turn-controller.js';
@@ -0,0 +1,69 @@
1
+ import type { ToolControlCommandName } from '@undefineds.co/models';
2
+ import type { AgentRuntimeCapabilityName } from './acp.js';
3
+ export type AgentParticipantRole = 'user' | 'primary-agent' | 'secretary' | 'system';
4
+ export type AgentTurnTrigger = 'user.message' | 'agent.message' | 'tool.call' | 'approval.required' | 'input.required' | 'grant.coverage.check' | 'session.idle' | 'session.error';
5
+ export type AgentTurnOutputKind = 'chat_message' | 'approval_decision' | 'input_answer' | 'control_command';
6
+ export interface AgentContextWindowPolicy {
7
+ recentMessages?: number;
8
+ includeCurrentApproval?: boolean;
9
+ includeMatchingGrants?: boolean;
10
+ includeToolCalls?: boolean;
11
+ includeToolResults?: boolean;
12
+ includeSystemEvents?: boolean;
13
+ }
14
+ export interface AgentTurnControllerRule {
15
+ id: string;
16
+ trigger: AgentTurnTrigger;
17
+ targetAgent: string;
18
+ targetRole: AgentParticipantRole;
19
+ requiredCapabilities?: AgentRuntimeCapabilityName[];
20
+ context: AgentContextWindowPolicy;
21
+ allowedOutputs: AgentTurnOutputKind[];
22
+ allowedControls?: ToolControlCommandName[];
23
+ requiresUserVisibleTrace?: boolean;
24
+ }
25
+ export interface GroupTurnAgent {
26
+ id: string;
27
+ name: string;
28
+ aliases?: string[];
29
+ uri?: string;
30
+ description?: string;
31
+ tags?: string[];
32
+ capabilityNames?: string[];
33
+ }
34
+ export interface GroupTurnMessage {
35
+ role: 'user' | 'assistant' | 'system';
36
+ content: string;
37
+ speaker?: string;
38
+ }
39
+ export interface GroupTurnDecision {
40
+ shouldReply: boolean;
41
+ targetAgentIds: string[];
42
+ reason?: string;
43
+ confidence?: number;
44
+ }
45
+ export interface GroupTurnRoute {
46
+ shouldReply: boolean;
47
+ targetAgentIds: string[];
48
+ routedBy: 'mention' | 'controller' | 'single-agent' | 'none';
49
+ coordinationId: string;
50
+ reason?: string;
51
+ confidence?: number;
52
+ }
53
+ export interface RouteGroupTurnInput {
54
+ latestUserMessage: string;
55
+ agents: GroupTurnAgent[];
56
+ history?: GroupTurnMessage[];
57
+ coordinationId?: string;
58
+ decide?: (input: {
59
+ latestUserMessage: string;
60
+ agents: GroupTurnAgent[];
61
+ history: GroupTurnMessage[];
62
+ }) => Promise<GroupTurnDecision>;
63
+ }
64
+ export declare function findMentionedGroupAgents(message: string, agents: GroupTurnAgent[]): GroupTurnAgent[];
65
+ export declare function routeGroupTurn(input: RouteGroupTurnInput): Promise<GroupTurnRoute>;
66
+ export declare const GROUP_AGENT_TURN_RULE: AgentTurnControllerRule;
67
+ export declare const WATCH_SECRETARY_APPROVAL_RULE: AgentTurnControllerRule;
68
+ export declare const WATCH_SECRETARY_INPUT_RULE: AgentTurnControllerRule;
69
+ export declare const DEFAULT_WATCH_SECRETARY_RULES: AgentTurnControllerRule[];