@adonis-agora/agent 0.60.1 → 0.61.0
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.
- package/CHANGELOG.md +34 -0
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +2 -0
- package/dist/configure.js.map +1 -1
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +119 -2
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/src/action-proposal-approval.d.ts +26 -0
- package/dist/src/action-proposal-approval.d.ts.map +1 -0
- package/dist/src/action-proposal-approval.js +28 -0
- package/dist/src/action-proposal-approval.js.map +1 -0
- package/dist/src/action-proposal-discovery.d.ts +9 -0
- package/dist/src/action-proposal-discovery.d.ts.map +1 -0
- package/dist/src/action-proposal-discovery.js +20 -0
- package/dist/src/action-proposal-discovery.js.map +1 -0
- package/dist/src/action-proposal-executor.d.ts +37 -0
- package/dist/src/action-proposal-executor.d.ts.map +1 -0
- package/dist/src/action-proposal-executor.js +70 -0
- package/dist/src/action-proposal-executor.js.map +1 -0
- package/dist/src/action-proposal-outcome.d.ts +12 -0
- package/dist/src/action-proposal-outcome.d.ts.map +1 -0
- package/dist/src/action-proposal-outcome.js +86 -0
- package/dist/src/action-proposal-outcome.js.map +1 -0
- package/dist/src/action-proposal-preparation.d.ts +20 -0
- package/dist/src/action-proposal-preparation.d.ts.map +1 -0
- package/dist/src/action-proposal-preparation.js +27 -0
- package/dist/src/action-proposal-preparation.js.map +1 -0
- package/dist/src/action-proposal-receipt.d.ts +12 -0
- package/dist/src/action-proposal-receipt.d.ts.map +1 -0
- package/dist/src/action-proposal-receipt.js +4 -0
- package/dist/src/action-proposal-receipt.js.map +1 -0
- package/dist/src/action-proposal-runtime.d.ts +9 -0
- package/dist/src/action-proposal-runtime.d.ts.map +1 -0
- package/dist/src/action-proposal-runtime.js +34 -0
- package/dist/src/action-proposal-runtime.js.map +1 -0
- package/dist/src/action-proposal-service.d.ts +43 -0
- package/dist/src/action-proposal-service.d.ts.map +1 -0
- package/dist/src/action-proposal-service.js +132 -0
- package/dist/src/action-proposal-service.js.map +1 -0
- package/dist/src/action-proposal-text.d.ts +33 -0
- package/dist/src/action-proposal-text.d.ts.map +1 -0
- package/dist/src/action-proposal-text.js +51 -0
- package/dist/src/action-proposal-text.js.map +1 -0
- package/dist/src/action-proposal-transitions.d.ts +20 -0
- package/dist/src/action-proposal-transitions.d.ts.map +1 -0
- package/dist/src/action-proposal-transitions.js +311 -0
- package/dist/src/action-proposal-transitions.js.map +1 -0
- package/dist/src/action-proposal-worker.d.ts +31 -0
- package/dist/src/action-proposal-worker.d.ts.map +1 -0
- package/dist/src/action-proposal-worker.js +133 -0
- package/dist/src/action-proposal-worker.js.map +1 -0
- package/dist/src/ag-ui/adapter.d.ts.map +1 -1
- package/dist/src/ag-ui/adapter.js +33 -0
- package/dist/src/ag-ui/adapter.js.map +1 -1
- package/dist/src/ag-ui/frames.d.ts.map +1 -1
- package/dist/src/ag-ui/frames.js +1 -0
- package/dist/src/ag-ui/frames.js.map +1 -1
- package/dist/src/ag-ui/proposal-decision.d.ts +9 -0
- package/dist/src/ag-ui/proposal-decision.d.ts.map +1 -0
- package/dist/src/ag-ui/proposal-decision.js +23 -0
- package/dist/src/ag-ui/proposal-decision.js.map +1 -0
- package/dist/src/agent-deps-factory.d.ts +5 -0
- package/dist/src/agent-deps-factory.d.ts.map +1 -1
- package/dist/src/agent-deps-factory.js +9 -0
- package/dist/src/agent-deps-factory.js.map +1 -1
- package/dist/src/agent-deps.d.ts +4 -0
- package/dist/src/agent-deps.d.ts.map +1 -1
- package/dist/src/agent-deps.js.map +1 -1
- package/dist/src/agent-loop.d.ts +4 -0
- package/dist/src/agent-loop.d.ts.map +1 -1
- package/dist/src/agent-loop.js +372 -62
- package/dist/src/agent-loop.js.map +1 -1
- package/dist/src/agent-service.d.ts +42 -1
- package/dist/src/agent-service.d.ts.map +1 -1
- package/dist/src/agent-service.js +49 -1
- package/dist/src/agent-service.js.map +1 -1
- package/dist/src/ai-tool-ref.d.ts +2 -1
- package/dist/src/ai-tool-ref.d.ts.map +1 -1
- package/dist/src/ai-tool-ref.js +22 -2
- package/dist/src/ai-tool-ref.js.map +1 -1
- package/dist/src/chat-queue-service.d.ts.map +1 -1
- package/dist/src/chat-queue-service.js +2 -0
- package/dist/src/chat-queue-service.js.map +1 -1
- package/dist/src/client/chat-client.d.ts +12 -0
- package/dist/src/client/chat-client.d.ts.map +1 -1
- package/dist/src/client/chat-client.js +69 -1
- package/dist/src/client/chat-client.js.map +1 -1
- package/dist/src/client/sse.d.ts +15 -0
- package/dist/src/client/sse.d.ts.map +1 -1
- package/dist/src/client/sse.js +45 -0
- package/dist/src/client/sse.js.map +1 -1
- package/dist/src/define_config.d.ts +9 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/genui/factory.d.ts +8 -1
- package/dist/src/genui/factory.d.ts.map +1 -1
- package/dist/src/genui/factory.js +3 -1
- package/dist/src/genui/factory.js.map +1 -1
- package/dist/src/genui/index.d.ts.map +1 -1
- package/dist/src/genui/index.js +1 -0
- package/dist/src/genui/index.js.map +1 -1
- package/dist/src/index.d.ts +18 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +18 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/negotiated-tool-ui.d.ts +10 -0
- package/dist/src/negotiated-tool-ui.d.ts.map +1 -0
- package/dist/src/negotiated-tool-ui.js +53 -0
- package/dist/src/negotiated-tool-ui.js.map +1 -0
- package/dist/src/spi/action-proposal-outcome-store.d.ts +43 -0
- package/dist/src/spi/action-proposal-outcome-store.d.ts.map +1 -0
- package/dist/src/spi/action-proposal-outcome-store.js +2 -0
- package/dist/src/spi/action-proposal-outcome-store.js.map +1 -0
- package/dist/src/spi/action-proposal-store.d.ts +152 -0
- package/dist/src/spi/action-proposal-store.d.ts.map +1 -0
- package/dist/src/spi/action-proposal-store.js +2 -0
- package/dist/src/spi/action-proposal-store.js.map +1 -0
- package/dist/src/spi/action-proposal-worker-store.d.ts +17 -0
- package/dist/src/spi/action-proposal-worker-store.d.ts.map +1 -0
- package/dist/src/spi/action-proposal-worker-store.js +2 -0
- package/dist/src/spi/action-proposal-worker-store.js.map +1 -0
- package/dist/src/spi/agent-store.d.ts +5 -0
- package/dist/src/spi/agent-store.d.ts.map +1 -1
- package/dist/src/spi/agent-store.js.map +1 -1
- package/dist/src/spi/approval-policy.d.ts +3 -0
- package/dist/src/spi/approval-policy.d.ts.map +1 -1
- package/dist/src/spi/approval-policy.js +8 -1
- package/dist/src/spi/approval-policy.js.map +1 -1
- package/dist/src/spi/background-actor-resolver.d.ts +9 -0
- package/dist/src/spi/background-actor-resolver.d.ts.map +1 -0
- package/dist/src/spi/background-actor-resolver.js +2 -0
- package/dist/src/spi/background-actor-resolver.js.map +1 -0
- package/dist/src/spi/chat-queue.d.ts +3 -0
- package/dist/src/spi/chat-queue.d.ts.map +1 -1
- package/dist/src/spi/chat-queue.js.map +1 -1
- package/dist/src/spi/token-stream-sink.d.ts +9 -0
- package/dist/src/spi/token-stream-sink.d.ts.map +1 -1
- package/dist/src/spi/token-stream-sink.js.map +1 -1
- package/dist/src/spi/tool.d.ts +22 -0
- package/dist/src/spi/tool.d.ts.map +1 -1
- package/dist/src/sse.d.ts.map +1 -1
- package/dist/src/sse.js +6 -0
- package/dist/src/sse.js.map +1 -1
- package/dist/src/stores/lucid-action-proposal-store.d.ts +55 -0
- package/dist/src/stores/lucid-action-proposal-store.d.ts.map +1 -0
- package/dist/src/stores/lucid-action-proposal-store.js +465 -0
- package/dist/src/stores/lucid-action-proposal-store.js.map +1 -0
- package/dist/src/stores/lucid-schema.d.ts +8 -6
- package/dist/src/stores/lucid-schema.d.ts.map +1 -1
- package/dist/src/stores/lucid-schema.js +59 -6
- package/dist/src/stores/lucid-schema.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +4 -2
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +43 -14
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/stores/sqlite-transactions.d.ts +8 -0
- package/dist/src/stores/sqlite-transactions.d.ts.map +1 -0
- package/dist/src/stores/sqlite-transactions.js +24 -0
- package/dist/src/stores/sqlite-transactions.js.map +1 -0
- package/dist/src/stream-events.d.ts +4 -0
- package/dist/src/stream-events.d.ts.map +1 -1
- package/dist/src/testing/in-memory-action-proposal-store.d.ts +32 -0
- package/dist/src/testing/in-memory-action-proposal-store.d.ts.map +1 -0
- package/dist/src/testing/in-memory-action-proposal-store.js +159 -0
- package/dist/src/testing/in-memory-action-proposal-store.js.map +1 -0
- package/dist/src/testing/in-memory-store.d.ts +9 -1
- package/dist/src/testing/in-memory-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-store.js +79 -1
- package/dist/src/testing/in-memory-store.js.map +1 -1
- package/dist/src/testing/index.d.ts +1 -0
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/tool-discovery.d.ts.map +1 -1
- package/dist/src/tool-discovery.js +7 -0
- package/dist/src/tool-discovery.js.map +1 -1
- package/dist/src/tool-registry.d.ts +25 -1
- package/dist/src/tool-registry.d.ts.map +1 -1
- package/dist/src/tool-registry.js +73 -3
- package/dist/src/tool-registry.js.map +1 -1
- package/dist/src/tool-retry.d.ts +0 -11
- package/dist/src/tool-retry.d.ts.map +1 -1
- package/dist/src/tool-retry.js +5 -1
- package/dist/src/tool-retry.js.map +1 -1
- package/dist/src/tool-ui.d.ts +4 -1
- package/dist/src/tool-ui.d.ts.map +1 -1
- package/dist/src/tool-ui.js +32 -4
- package/dist/src/tool-ui.js.map +1 -1
- package/dist/src/types.d.ts +28 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/ui-capabilities.d.ts +9 -0
- package/dist/src/ui-capabilities.d.ts.map +1 -0
- package/dist/src/ui-capabilities.js +25 -0
- package/dist/src/ui-capabilities.js.map +1 -0
- package/dist/stubs/database/migrations/add_action_proposal_discovery.stub +24 -0
- package/dist/stubs/database/migrations/add_action_proposal_runtime.stub +19 -0
- package/dist/stubs/database/migrations/create_agent_tables.stub +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { parseTextActionProposalCommand, resolveTextActionProposalDecision, } from './action-proposal-text.js';
|
|
2
|
+
import { validateActionProposalListQuery } from './action-proposal-transitions.js';
|
|
3
|
+
import { mayDecideApproval } from './spi/approval-policy.js';
|
|
4
|
+
export class ActionProposalServiceError extends Error {
|
|
5
|
+
status;
|
|
6
|
+
constructor(status, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Authenticated decisions live independently of the origin runner and its signals. */
|
|
12
|
+
export class ActionProposalService {
|
|
13
|
+
store;
|
|
14
|
+
policy;
|
|
15
|
+
constructor(store, policy) {
|
|
16
|
+
this.store = store;
|
|
17
|
+
this.policy = policy;
|
|
18
|
+
}
|
|
19
|
+
async scope(actor, threadId) {
|
|
20
|
+
const scope = await this.store.getThreadActionProposalScope(threadId);
|
|
21
|
+
if (!scope)
|
|
22
|
+
throw new ActionProposalServiceError(404, 'Unknown thread');
|
|
23
|
+
if ((actor.tenantRef ?? null) !== scope.tenantRef)
|
|
24
|
+
throw new ActionProposalServiceError(403, 'Forbidden tenant');
|
|
25
|
+
return scope;
|
|
26
|
+
}
|
|
27
|
+
async list(actor, threadId, after) {
|
|
28
|
+
return (await this.listPage(actor, threadId, after)).items;
|
|
29
|
+
}
|
|
30
|
+
async listPage(actor, threadId, after) {
|
|
31
|
+
const scope = await this.scope(actor, threadId);
|
|
32
|
+
const query = { limit: 1000, ...(after !== undefined ? { after } : {}) };
|
|
33
|
+
validateActionProposalListQuery(query);
|
|
34
|
+
const raw = await this.store.listActionProposals(scope, query);
|
|
35
|
+
const last = raw.at(-1);
|
|
36
|
+
const next = raw.length === 1000 && last ? { createdAt: last.createdAt, id: last.id } : undefined;
|
|
37
|
+
const permitted = actor.id === scope.actorRef
|
|
38
|
+
? raw
|
|
39
|
+
: (await Promise.all(raw.map(async (proposal) => (await this.canDecide(actor, proposal)) ? proposal : null))).filter((proposal) => proposal !== null);
|
|
40
|
+
return { items: permitted, ...(next !== undefined ? { next } : {}) };
|
|
41
|
+
}
|
|
42
|
+
async handleTextDecision(actor, threadId, text) {
|
|
43
|
+
const command = parseTextActionProposalCommand(text);
|
|
44
|
+
if (command.status === 'unmatched')
|
|
45
|
+
return command;
|
|
46
|
+
if (command.proposalId !== undefined) {
|
|
47
|
+
const result = await this.decide(actor, threadId, command.proposalId, command.decision, { remember: command.remember }, 'text');
|
|
48
|
+
return {
|
|
49
|
+
threadId,
|
|
50
|
+
proposalDecision: result,
|
|
51
|
+
text: this.decisionText(result, command.decision),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const scope = await this.scope(actor, threadId);
|
|
55
|
+
const visible = await this.store.listActionProposals(scope, {
|
|
56
|
+
decision: 'pending',
|
|
57
|
+
limit: 1000,
|
|
58
|
+
});
|
|
59
|
+
const permitted = await Promise.all(visible.map(async (proposal) => ((await this.canDecide(actor, proposal)) ? proposal : null)));
|
|
60
|
+
const resolution = resolveTextActionProposalDecision(text, permitted.filter((proposal) => proposal !== null));
|
|
61
|
+
if (resolution.status === 'unmatched')
|
|
62
|
+
return resolution;
|
|
63
|
+
if (visible.length === 1000 && resolution.status === 'decision' && !text.includes('#'))
|
|
64
|
+
return {
|
|
65
|
+
threadId,
|
|
66
|
+
proposalDecision: {
|
|
67
|
+
status: 'ambiguous',
|
|
68
|
+
proposalIds: permitted
|
|
69
|
+
.filter((proposal) => proposal !== null)
|
|
70
|
+
.map((proposal) => proposal.id),
|
|
71
|
+
},
|
|
72
|
+
text: 'Há várias propostas. Confirme ou rejeite usando #ID explícito.',
|
|
73
|
+
};
|
|
74
|
+
if (resolution.status === 'ambiguous')
|
|
75
|
+
return {
|
|
76
|
+
threadId,
|
|
77
|
+
proposalDecision: resolution,
|
|
78
|
+
text: `Qual proposta? Responda confirmar #ID ou cancelar #ID: ${resolution.proposalIds.join(', ')}`,
|
|
79
|
+
};
|
|
80
|
+
const result = await this.decide(actor, threadId, resolution.proposalId, resolution.decision, { remember: resolution.remember }, 'text');
|
|
81
|
+
return {
|
|
82
|
+
threadId,
|
|
83
|
+
proposalDecision: result,
|
|
84
|
+
text: this.decisionText(result, resolution.decision),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
decisionText(result, decision) {
|
|
88
|
+
return result.status === 'expired' || result.proposal?.decision === 'expired'
|
|
89
|
+
? 'A proposta expirou; nenhuma ação foi executada.'
|
|
90
|
+
: result.status === 'applied' || result.status === 'unchanged'
|
|
91
|
+
? decision === 'approved'
|
|
92
|
+
? 'Proposta aprovada e enfileirada para execução.'
|
|
93
|
+
: 'Proposta rejeitada; nenhuma ação foi executada.'
|
|
94
|
+
: 'Não foi possível alterar esta proposta; atualize a lista para consultar seu estado.';
|
|
95
|
+
}
|
|
96
|
+
canDecide(actor, proposal) {
|
|
97
|
+
return mayDecideApproval(this.policy, actor, {
|
|
98
|
+
toolCallId: proposal.originToolCallId,
|
|
99
|
+
approver: proposal.approver,
|
|
100
|
+
requesterRef: proposal.actorRef,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async decide(actor, threadId, proposalId, decision, body, via = 'web') {
|
|
104
|
+
if (!body || typeof body !== 'object' || Array.isArray(body))
|
|
105
|
+
throw new ActionProposalServiceError(400, 'Invalid decision body');
|
|
106
|
+
const fields = Object.keys(body);
|
|
107
|
+
if (fields.some((field) => !['remember', 'reason'].includes(field)))
|
|
108
|
+
throw new ActionProposalServiceError(400, 'Invalid decision fields');
|
|
109
|
+
const { remember, reason } = body;
|
|
110
|
+
if ((remember !== undefined && typeof remember !== 'boolean') ||
|
|
111
|
+
(reason !== undefined && typeof reason !== 'string'))
|
|
112
|
+
throw new ActionProposalServiceError(400, 'Invalid decision values');
|
|
113
|
+
const scope = await this.scope(actor, threadId);
|
|
114
|
+
const proposal = await this.store.getActionProposal(scope, proposalId);
|
|
115
|
+
if (!proposal)
|
|
116
|
+
throw new ActionProposalServiceError(404, 'Unknown proposal');
|
|
117
|
+
if (!(await mayDecideApproval(this.policy, actor, {
|
|
118
|
+
toolCallId: proposal.originToolCallId,
|
|
119
|
+
approver: proposal.approver,
|
|
120
|
+
requesterRef: proposal.actorRef,
|
|
121
|
+
})))
|
|
122
|
+
throw new ActionProposalServiceError(403, 'Forbidden decision');
|
|
123
|
+
return this.store.decideActionProposal(scope, proposalId, {
|
|
124
|
+
decision,
|
|
125
|
+
actorRef: actor.id,
|
|
126
|
+
via,
|
|
127
|
+
...(typeof remember === 'boolean' ? { remember } : {}),
|
|
128
|
+
...(typeof reason === 'string' ? { reason } : {}),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=action-proposal-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposal-service.js","sourceRoot":"","sources":["../../src/action-proposal-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ActionProposalDecision } from './spi/action-proposal-store.js';
|
|
2
|
+
export interface TextActionProposalCandidate {
|
|
3
|
+
id: string;
|
|
4
|
+
decision: ActionProposalDecision;
|
|
5
|
+
}
|
|
6
|
+
export type TextActionProposalResolution = {
|
|
7
|
+
status: 'unmatched';
|
|
8
|
+
} | {
|
|
9
|
+
status: 'ambiguous';
|
|
10
|
+
proposalIds: string[];
|
|
11
|
+
} | {
|
|
12
|
+
status: 'decision';
|
|
13
|
+
proposalId: string;
|
|
14
|
+
decision: 'approved' | 'rejected';
|
|
15
|
+
remember: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Recognizes complete, explicit decision messages. This grants no authority: callers must
|
|
19
|
+
* resolve the authenticated actor and use the normal scoped decision service with via=text.
|
|
20
|
+
* Never feed model output here or consume an unmatched message as an approval.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveTextActionProposalDecision(text: string, proposals: readonly TextActionProposalCandidate[]): TextActionProposalResolution;
|
|
23
|
+
export type TextActionProposalCommand = {
|
|
24
|
+
status: 'unmatched';
|
|
25
|
+
} | {
|
|
26
|
+
status: 'command';
|
|
27
|
+
decision: 'approved' | 'rejected';
|
|
28
|
+
remember: boolean;
|
|
29
|
+
proposalId?: string;
|
|
30
|
+
};
|
|
31
|
+
/** Parse exact consent syntax only. Authentication and target lookup remain the caller's responsibility. */
|
|
32
|
+
export declare function parseTextActionProposalCommand(text: string): TextActionProposalCommand;
|
|
33
|
+
//# sourceMappingURL=action-proposal-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposal-text.d.ts","sourceRoot":"","sources":["../../src/action-proposal-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AACD,MAAM,MAAM,4BAA4B,GACpC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9C;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEN;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,2BAA2B,EAAE,GAChD,4BAA4B,CAe9B;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AACN,4GAA4G;AAC5G,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAqBtF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recognizes complete, explicit decision messages. This grants no authority: callers must
|
|
3
|
+
* resolve the authenticated actor and use the normal scoped decision service with via=text.
|
|
4
|
+
* Never feed model output here or consume an unmatched message as an approval.
|
|
5
|
+
*/
|
|
6
|
+
export function resolveTextActionProposalDecision(text, proposals) {
|
|
7
|
+
const command = parseTextActionProposalCommand(text);
|
|
8
|
+
if (command.status === 'unmatched')
|
|
9
|
+
return command;
|
|
10
|
+
const { decision, remember } = command;
|
|
11
|
+
const pending = proposals.filter((proposal) => proposal.decision === 'pending');
|
|
12
|
+
const explicitId = command.proposalId;
|
|
13
|
+
if (explicitId !== undefined) {
|
|
14
|
+
if (!pending.some((proposal) => proposal.id === explicitId))
|
|
15
|
+
return { status: 'unmatched' };
|
|
16
|
+
return { status: 'decision', proposalId: explicitId, decision, remember };
|
|
17
|
+
}
|
|
18
|
+
if (pending.length === 0)
|
|
19
|
+
return { status: 'unmatched' };
|
|
20
|
+
if (pending.length > 1)
|
|
21
|
+
return { status: 'ambiguous', proposalIds: pending.map(({ id }) => id) };
|
|
22
|
+
const candidate = pending[0];
|
|
23
|
+
if (!candidate)
|
|
24
|
+
return { status: 'unmatched' };
|
|
25
|
+
return { status: 'decision', proposalId: candidate.id, decision, remember };
|
|
26
|
+
}
|
|
27
|
+
/** Parse exact consent syntax only. Authentication and target lookup remain the caller's responsibility. */
|
|
28
|
+
export function parseTextActionProposalCommand(text) {
|
|
29
|
+
if (/[\r\n]/u.test(text))
|
|
30
|
+
return { status: 'unmatched' };
|
|
31
|
+
const normalized = text.trim();
|
|
32
|
+
const match = /^(sim|confirmo|confirmar|aprovar|aprovo|cancelar|rejeitar|rejeito|não|nao)(?: (sempre nesta conversa))?(?: #([^\s]+?))?[.!]?$/iu.exec(normalized);
|
|
33
|
+
if (!match)
|
|
34
|
+
return { status: 'unmatched' };
|
|
35
|
+
const verb = match[1]?.toLocaleLowerCase('pt-BR');
|
|
36
|
+
if (verb === undefined)
|
|
37
|
+
return { status: 'unmatched' };
|
|
38
|
+
const decision = ['cancelar', 'rejeitar', 'rejeito', 'não', 'nao'].includes(verb)
|
|
39
|
+
? 'rejected'
|
|
40
|
+
: 'approved';
|
|
41
|
+
const remember = match[2] !== undefined;
|
|
42
|
+
if (remember && decision !== 'approved')
|
|
43
|
+
return { status: 'unmatched' };
|
|
44
|
+
return {
|
|
45
|
+
status: 'command',
|
|
46
|
+
decision,
|
|
47
|
+
remember,
|
|
48
|
+
...(match[3] !== undefined ? { proposalId: match[3] } : {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=action-proposal-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposal-text.js","sourceRoot":"","sources":["../../src/action-proposal-text.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,MAAM,UAAU,iCAAiC,CAC/C,IAAY,EACZ,SAAiD;IAEjD,MAAM,OAAO,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IACnD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAC5F,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACjG,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC9E,CAAC;AAUD,4GAA4G;AAC5G,MAAM,UAAU,8BAA8B,CAAC,IAAY;IACzD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GACT,iIAAiI,CAAC,IAAI,CACpI,UAAU,CACX,CAAC;IACJ,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/E,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,UAAU,CAAC;IACf,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IACxC,IAAI,QAAQ,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACxE,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,QAAQ;QACR,QAAQ;QACR,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ActionProposal, ActionProposalDecisionCommand, ActionProposalMutationResult, ActionProposalScope, ClaimActionProposal, CreateActionProposal, ExtendActionProposalLease, ListActionProposals, SettleActionProposal } from './spi/action-proposal-store.js';
|
|
2
|
+
export declare function validateActionProposalCreation(input: CreateActionProposal): void;
|
|
3
|
+
export declare function validateActionProposalListQuery(query?: ListActionProposals): number;
|
|
4
|
+
/** Canonical JSON snapshots keep replay equality independent of object key insertion order. */
|
|
5
|
+
export declare function canonicalActionProposalJson(value: unknown): string;
|
|
6
|
+
export declare function snapshotActionProposal<T>(value: T): T;
|
|
7
|
+
export declare function actionProposalScopeMatches(row: ActionProposalScope, scope: ActionProposalScope): boolean;
|
|
8
|
+
export declare function initialActionProposal(input: CreateActionProposal, now: number): ActionProposal;
|
|
9
|
+
export declare function actionProposalCreationMatches(row: ActionProposal, input: CreateActionProposal): boolean;
|
|
10
|
+
export declare function transitionActionProposalDecision(row: ActionProposal, command: ActionProposalDecisionCommand, now: number): ActionProposalMutationResult;
|
|
11
|
+
export declare function transitionActionProposalClaim(row: ActionProposal, command: ClaimActionProposal, now: number, token: string): ActionProposalMutationResult;
|
|
12
|
+
export declare function transitionActionProposalLease(row: ActionProposal, command: ExtendActionProposalLease, now: number): ActionProposalMutationResult;
|
|
13
|
+
export declare function transitionActionProposalSettlement(row: ActionProposal, command: SettleActionProposal, now: number): ActionProposalMutationResult;
|
|
14
|
+
/** Caller must obtain the replacement through the same full scope and persistence authority. */
|
|
15
|
+
export declare function transitionActionProposalSupersession(row: ActionProposal, replacement: ActionProposal, command: {
|
|
16
|
+
replacementProposalId: string;
|
|
17
|
+
actorRef: string;
|
|
18
|
+
via: string;
|
|
19
|
+
}, now: number): ActionProposalMutationResult;
|
|
20
|
+
//# sourceMappingURL=action-proposal-transitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposal-transitions.d.ts","sourceRoot":"","sources":["../../src/action-proposal-transitions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,6BAA6B,EAC7B,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AAWxC,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAmEhF;AAED,wBAAgB,+BAA+B,CAAC,KAAK,GAAE,mBAAwB,GAAG,MAAM,CAuBvF;AAED,+FAA+F;AAC/F,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAsBlE;AACD,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAErD;AACD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAMT;AACD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAW9F;AACD,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAcT;AAOD,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,6BAA6B,EACtC,GAAG,EAAE,MAAM,GACV,4BAA4B,CA2C9B;AAMD,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,4BAA4B,CAqB9B;AAsBD,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,yBAAyB,EAClC,GAAG,EAAE,MAAM,GACV,4BAA4B,CAY9B;AACD,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,MAAM,GACV,4BAA4B,CA2B9B;AAED,gGAAgG;AAChG,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE;IAAE,qBAAqB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACzE,GAAG,EAAE,MAAM,GACV,4BAA4B,CAuC9B"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { attachActionProposalOutcome } from './action-proposal-outcome.js';
|
|
2
|
+
import { validateUiCapabilities } from './ui-capabilities.js';
|
|
3
|
+
function checkTime(value) {
|
|
4
|
+
if (!Number.isSafeInteger(value))
|
|
5
|
+
throw new RangeError('Action proposal timestamps must be safe integer milliseconds');
|
|
6
|
+
}
|
|
7
|
+
function checkString(value) {
|
|
8
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
9
|
+
throw new TypeError('Action proposal identifiers must be nonempty strings');
|
|
10
|
+
}
|
|
11
|
+
export function validateActionProposalCreation(input) {
|
|
12
|
+
const allowed = [
|
|
13
|
+
'id',
|
|
14
|
+
'tenantRef',
|
|
15
|
+
'actorRef',
|
|
16
|
+
'threadId',
|
|
17
|
+
'originRunId',
|
|
18
|
+
'originMessageId',
|
|
19
|
+
'originToolCallId',
|
|
20
|
+
'toolName',
|
|
21
|
+
'input',
|
|
22
|
+
'preparationInput',
|
|
23
|
+
'executionContext',
|
|
24
|
+
'confirmation',
|
|
25
|
+
'approver',
|
|
26
|
+
'expiresAt',
|
|
27
|
+
'idempotencyKey',
|
|
28
|
+
'replacementKey',
|
|
29
|
+
];
|
|
30
|
+
if (Object.keys(input).some((key) => !allowed.includes(key)))
|
|
31
|
+
throw new TypeError('Unknown action proposal creation field');
|
|
32
|
+
for (const key of [
|
|
33
|
+
'id',
|
|
34
|
+
'actorRef',
|
|
35
|
+
'threadId',
|
|
36
|
+
'originRunId',
|
|
37
|
+
'originMessageId',
|
|
38
|
+
'originToolCallId',
|
|
39
|
+
'toolName',
|
|
40
|
+
'approver',
|
|
41
|
+
'idempotencyKey',
|
|
42
|
+
])
|
|
43
|
+
checkString(input[key]);
|
|
44
|
+
if (input.tenantRef !== null && typeof input.tenantRef !== 'string')
|
|
45
|
+
throw new TypeError('tenantRef must be an explicit string or null');
|
|
46
|
+
for (const value of [input.id, input.actorRef, input.threadId, input.tenantRef]) {
|
|
47
|
+
if (value !== null && value.length > 255)
|
|
48
|
+
throw new RangeError('Action proposal id and scope must fit 255 UTF-16 code units');
|
|
49
|
+
}
|
|
50
|
+
if (input.replacementKey !== undefined) {
|
|
51
|
+
checkString(input.replacementKey);
|
|
52
|
+
if (input.replacementKey.length > 255)
|
|
53
|
+
throw new RangeError('replacementKey must fit 255 UTF-16 code units');
|
|
54
|
+
}
|
|
55
|
+
if (Object.hasOwn(input, 'executionContext')) {
|
|
56
|
+
const context = input.executionContext;
|
|
57
|
+
if (context === null || typeof context !== 'object' || Array.isArray(context))
|
|
58
|
+
throw new TypeError('executionContext must be a JSON object');
|
|
59
|
+
const allowedContext = ['agentName', 'persona', 'requestId', 'pageContext', 'uiCapabilities'];
|
|
60
|
+
if (Object.keys(context).some((key) => !allowedContext.includes(key)))
|
|
61
|
+
throw new TypeError('Unknown execution context field');
|
|
62
|
+
checkString(context.requestId);
|
|
63
|
+
if (Object.hasOwn(context, 'uiCapabilities'))
|
|
64
|
+
validateUiCapabilities(context.uiCapabilities);
|
|
65
|
+
if (Object.hasOwn(context, 'agentName'))
|
|
66
|
+
checkString(context.agentName);
|
|
67
|
+
if (Object.hasOwn(context, 'persona'))
|
|
68
|
+
checkString(context.persona);
|
|
69
|
+
if (Object.hasOwn(context, 'pageContext')) {
|
|
70
|
+
const page = context.pageContext;
|
|
71
|
+
if (page === null || typeof page !== 'object' || Array.isArray(page))
|
|
72
|
+
throw new TypeError('pageContext must be a JSON object');
|
|
73
|
+
if (Object.hasOwn(page, 'kind') && typeof page.kind !== 'string')
|
|
74
|
+
throw new TypeError('pageContext.kind must be a string');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (input.expiresAt !== null)
|
|
78
|
+
checkTime(input.expiresAt);
|
|
79
|
+
checkString(input.confirmation?.title);
|
|
80
|
+
checkString(input.confirmation?.verb);
|
|
81
|
+
canonicalActionProposalJson(input);
|
|
82
|
+
}
|
|
83
|
+
export function validateActionProposalListQuery(query = {}) {
|
|
84
|
+
const limit = query.limit === undefined ? 100 : query.limit;
|
|
85
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 1000)
|
|
86
|
+
throw new RangeError('limit must be an integer from 1 to 1000');
|
|
87
|
+
if (query.decision !== undefined &&
|
|
88
|
+
!['pending', 'approved', 'rejected', 'expired', 'superseded'].includes(query.decision))
|
|
89
|
+
throw new TypeError('Unsupported action proposal list decision');
|
|
90
|
+
if (query.after !== undefined) {
|
|
91
|
+
const after = query.after;
|
|
92
|
+
if (typeof after !== 'object' ||
|
|
93
|
+
after === null ||
|
|
94
|
+
Array.isArray(after) ||
|
|
95
|
+
Object.keys(after).some((key) => key !== 'createdAt' && key !== 'id'))
|
|
96
|
+
throw new TypeError('Invalid action proposal cursor');
|
|
97
|
+
checkTime(after.createdAt);
|
|
98
|
+
checkString(after.id);
|
|
99
|
+
if (after.id.length > 255)
|
|
100
|
+
throw new TypeError('Action proposal cursor id is too long');
|
|
101
|
+
}
|
|
102
|
+
return limit;
|
|
103
|
+
}
|
|
104
|
+
/** Canonical JSON snapshots keep replay equality independent of object key insertion order. */
|
|
105
|
+
export function canonicalActionProposalJson(value) {
|
|
106
|
+
const ancestors = new Set();
|
|
107
|
+
const sort = (item) => {
|
|
108
|
+
if (item === null || typeof item === 'string' || typeof item === 'boolean')
|
|
109
|
+
return item;
|
|
110
|
+
if (typeof item === 'number' && Number.isFinite(item))
|
|
111
|
+
return item;
|
|
112
|
+
if (typeof item !== 'object' || item === null || ancestors.has(item))
|
|
113
|
+
throw new TypeError('Action proposals require finite, acyclic JSON values');
|
|
114
|
+
const prototype = Object.getPrototypeOf(item);
|
|
115
|
+
if (!Array.isArray(item) && prototype !== Object.prototype && prototype !== null)
|
|
116
|
+
throw new TypeError('Action proposals require plain JSON objects');
|
|
117
|
+
ancestors.add(item);
|
|
118
|
+
const sorted = Array.isArray(item)
|
|
119
|
+
? Array.from(item, sort)
|
|
120
|
+
: Object.fromEntries(Object.keys(item)
|
|
121
|
+
.sort()
|
|
122
|
+
.map((key) => [key, sort(item[key])]));
|
|
123
|
+
ancestors.delete(item);
|
|
124
|
+
return sorted;
|
|
125
|
+
};
|
|
126
|
+
return JSON.stringify(sort(value));
|
|
127
|
+
}
|
|
128
|
+
export function snapshotActionProposal(value) {
|
|
129
|
+
return JSON.parse(canonicalActionProposalJson(value));
|
|
130
|
+
}
|
|
131
|
+
export function actionProposalScopeMatches(row, scope) {
|
|
132
|
+
return (row.tenantRef === scope.tenantRef &&
|
|
133
|
+
row.actorRef === scope.actorRef &&
|
|
134
|
+
row.threadId === scope.threadId);
|
|
135
|
+
}
|
|
136
|
+
export function initialActionProposal(input, now) {
|
|
137
|
+
validateActionProposalCreation(input);
|
|
138
|
+
checkTime(now);
|
|
139
|
+
return snapshotActionProposal({
|
|
140
|
+
...input,
|
|
141
|
+
decision: 'pending',
|
|
142
|
+
decisionAudit: null,
|
|
143
|
+
execution: null,
|
|
144
|
+
createdAt: now,
|
|
145
|
+
updatedAt: now,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
export function actionProposalCreationMatches(row, input) {
|
|
149
|
+
validateActionProposalCreation(input);
|
|
150
|
+
const { decision: _decision, decisionAudit: _audit, execution: _execution, createdAt: _created, updatedAt: _updated, supersededBy: _supersededBy, outcome: _outcome, outcomeDelivery: _delivery, ...original } = row;
|
|
151
|
+
return canonicalActionProposalJson(original) === canonicalActionProposalJson(input);
|
|
152
|
+
}
|
|
153
|
+
function result(status, proposal) {
|
|
154
|
+
return { status, proposal: snapshotActionProposal(proposal) };
|
|
155
|
+
}
|
|
156
|
+
export function transitionActionProposalDecision(row, command, now) {
|
|
157
|
+
checkTime(now);
|
|
158
|
+
if (!['approved', 'rejected', 'expired'].includes(command.decision))
|
|
159
|
+
throw new TypeError('Unsupported action proposal decision');
|
|
160
|
+
checkString(command.actorRef);
|
|
161
|
+
checkString(command.via);
|
|
162
|
+
if (command.reason !== undefined && typeof command.reason !== 'string')
|
|
163
|
+
throw new TypeError('reason must be a string');
|
|
164
|
+
if (command.remember !== undefined && typeof command.remember !== 'boolean')
|
|
165
|
+
throw new TypeError('remember must be a boolean');
|
|
166
|
+
if (row.decision !== 'pending') {
|
|
167
|
+
return result(row.decision === command.decision
|
|
168
|
+
? 'unchanged'
|
|
169
|
+
: row.decision === 'expired'
|
|
170
|
+
? 'expired'
|
|
171
|
+
: 'conflict', row);
|
|
172
|
+
}
|
|
173
|
+
const next = snapshotActionProposal(row);
|
|
174
|
+
if (row.expiresAt !== null && now >= row.expiresAt) {
|
|
175
|
+
next.decision = 'expired';
|
|
176
|
+
next.decisionAudit = { actorRef: 'system', via: 'expiry', at: now };
|
|
177
|
+
next.updatedAt = now;
|
|
178
|
+
return result(command.decision === 'expired' ? 'applied' : 'expired', attachActionProposalOutcome(next, now));
|
|
179
|
+
}
|
|
180
|
+
if (command.decision === 'expired')
|
|
181
|
+
return result('conflict', row);
|
|
182
|
+
const { decision, ...audit } = command;
|
|
183
|
+
next.decision = decision;
|
|
184
|
+
next.decisionAudit = {
|
|
185
|
+
actorRef: audit.actorRef,
|
|
186
|
+
via: audit.via,
|
|
187
|
+
at: now,
|
|
188
|
+
...(audit.reason === undefined ? {} : { reason: audit.reason }),
|
|
189
|
+
...(audit.remember === undefined ? {} : { remember: audit.remember }),
|
|
190
|
+
};
|
|
191
|
+
next.updatedAt = now;
|
|
192
|
+
if (decision === 'approved')
|
|
193
|
+
next.execution = { status: 'queued', generation: 0, lease: null };
|
|
194
|
+
return result('applied', decision === 'approved' ? next : attachActionProposalOutcome(next, now));
|
|
195
|
+
}
|
|
196
|
+
function checkLeaseMs(leaseMs, now) {
|
|
197
|
+
checkTime(now);
|
|
198
|
+
if (!Number.isSafeInteger(leaseMs) || leaseMs <= 0 || !Number.isSafeInteger(now + leaseMs))
|
|
199
|
+
throw new RangeError('leaseMs must be finite and positive');
|
|
200
|
+
}
|
|
201
|
+
export function transitionActionProposalClaim(row, command, now, token) {
|
|
202
|
+
checkLeaseMs(command.leaseMs, now);
|
|
203
|
+
checkString(command.workerId);
|
|
204
|
+
checkString(token);
|
|
205
|
+
const execution = row.execution;
|
|
206
|
+
if (row.decision !== 'approved' ||
|
|
207
|
+
!execution ||
|
|
208
|
+
(execution.status !== 'queued' &&
|
|
209
|
+
!(execution.status === 'executing' && execution.lease && now >= execution.lease.expiresAt)))
|
|
210
|
+
return result('conflict', row);
|
|
211
|
+
const next = snapshotActionProposal(row);
|
|
212
|
+
const generation = execution.generation + 1;
|
|
213
|
+
next.execution = {
|
|
214
|
+
status: 'executing',
|
|
215
|
+
generation,
|
|
216
|
+
lease: { token, generation, workerId: command.workerId, expiresAt: now + command.leaseMs },
|
|
217
|
+
};
|
|
218
|
+
next.updatedAt = now;
|
|
219
|
+
return result('applied', next);
|
|
220
|
+
}
|
|
221
|
+
function leaseStatus(row, command, now) {
|
|
222
|
+
checkTime(now);
|
|
223
|
+
checkString(command.token);
|
|
224
|
+
if (!Number.isSafeInteger(command.generation) || command.generation < 1)
|
|
225
|
+
throw new RangeError('Invalid lease generation');
|
|
226
|
+
const work = row.execution;
|
|
227
|
+
if (row.decision !== 'approved' ||
|
|
228
|
+
work?.status !== 'executing' ||
|
|
229
|
+
!work.lease ||
|
|
230
|
+
work.generation !== command.generation ||
|
|
231
|
+
work.lease.generation !== command.generation ||
|
|
232
|
+
work.lease.token !== command.token)
|
|
233
|
+
return 'conflict';
|
|
234
|
+
return now >= work.lease.expiresAt ? 'expired' : 'valid';
|
|
235
|
+
}
|
|
236
|
+
export function transitionActionProposalLease(row, command, now) {
|
|
237
|
+
checkLeaseMs(command.leaseMs, now);
|
|
238
|
+
const status = leaseStatus(row, command, now);
|
|
239
|
+
if (status !== 'valid')
|
|
240
|
+
return result(status, row);
|
|
241
|
+
const next = snapshotActionProposal(row);
|
|
242
|
+
if (next.execution?.lease)
|
|
243
|
+
next.execution.lease.expiresAt = Math.max(next.execution.lease.expiresAt, now + command.leaseMs);
|
|
244
|
+
next.updatedAt = now;
|
|
245
|
+
return result('applied', next);
|
|
246
|
+
}
|
|
247
|
+
export function transitionActionProposalSettlement(row, command, now) {
|
|
248
|
+
checkTime(now);
|
|
249
|
+
if (command.status !== 'succeeded' && command.status !== 'failed')
|
|
250
|
+
throw new TypeError('Unsupported settlement status');
|
|
251
|
+
if ((command.status === 'succeeded' && command.error !== undefined) ||
|
|
252
|
+
(command.status === 'failed' &&
|
|
253
|
+
(typeof command.error !== 'string' || command.result !== undefined)))
|
|
254
|
+
throw new TypeError('Ambiguous action proposal settlement');
|
|
255
|
+
const status = leaseStatus(row, command, now);
|
|
256
|
+
if (status !== 'valid')
|
|
257
|
+
return result(status, row);
|
|
258
|
+
const next = snapshotActionProposal(row);
|
|
259
|
+
next.execution =
|
|
260
|
+
command.status === 'succeeded'
|
|
261
|
+
? {
|
|
262
|
+
status: 'succeeded',
|
|
263
|
+
generation: command.generation,
|
|
264
|
+
lease: null,
|
|
265
|
+
...(command.result === undefined ? {} : { result: command.result }),
|
|
266
|
+
}
|
|
267
|
+
: { status: 'failed', generation: command.generation, lease: null, error: command.error };
|
|
268
|
+
if (command.ui !== undefined)
|
|
269
|
+
canonicalActionProposalJson(command.ui);
|
|
270
|
+
if (command.text !== undefined && typeof command.text !== 'string')
|
|
271
|
+
throw new TypeError('Outcome text must be a string');
|
|
272
|
+
next.updatedAt = now;
|
|
273
|
+
return result('applied', attachActionProposalOutcome(next, now, command.ui, command.text));
|
|
274
|
+
}
|
|
275
|
+
/** Caller must obtain the replacement through the same full scope and persistence authority. */
|
|
276
|
+
export function transitionActionProposalSupersession(row, replacement, command, now) {
|
|
277
|
+
checkTime(now);
|
|
278
|
+
checkString(command.replacementProposalId);
|
|
279
|
+
checkString(command.actorRef);
|
|
280
|
+
checkString(command.via);
|
|
281
|
+
if (replacement.id !== command.replacementProposalId ||
|
|
282
|
+
row.id === replacement.id ||
|
|
283
|
+
!actionProposalScopeMatches(row, replacement) ||
|
|
284
|
+
row.toolName !== replacement.toolName ||
|
|
285
|
+
!row.replacementKey ||
|
|
286
|
+
row.replacementKey !== replacement.replacementKey)
|
|
287
|
+
return result('conflict', row);
|
|
288
|
+
if (row.decision === 'superseded')
|
|
289
|
+
return result(row.supersededBy === replacement.id ? 'unchanged' : 'conflict', row);
|
|
290
|
+
if (row.decision !== 'pending')
|
|
291
|
+
return result('conflict', row);
|
|
292
|
+
if (row.expiresAt !== null && now >= row.expiresAt)
|
|
293
|
+
return {
|
|
294
|
+
...transitionActionProposalDecision(row, { decision: 'expired', actorRef: 'system', via: 'expiry' }, now),
|
|
295
|
+
status: 'expired',
|
|
296
|
+
};
|
|
297
|
+
const next = snapshotActionProposal({
|
|
298
|
+
...row,
|
|
299
|
+
decision: 'superseded',
|
|
300
|
+
supersededBy: replacement.id,
|
|
301
|
+
decisionAudit: {
|
|
302
|
+
actorRef: command.actorRef,
|
|
303
|
+
via: command.via,
|
|
304
|
+
replacementProposalId: replacement.id,
|
|
305
|
+
at: now,
|
|
306
|
+
},
|
|
307
|
+
updatedAt: now,
|
|
308
|
+
});
|
|
309
|
+
return result('applied', attachActionProposalOutcome(next, now));
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=action-proposal-transitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposal-transitions.js","sourceRoot":"","sources":["../../src/action-proposal-transitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ActionProposalExecutor } from './action-proposal-executor.js';
|
|
2
|
+
import type { ActionProposalOutcomeStore } from './spi/action-proposal-outcome-store.js';
|
|
3
|
+
import type { ActionProposal, ActionProposalStore } from './spi/action-proposal-store.js';
|
|
4
|
+
import type { ActionProposalWorkerStore } from './spi/action-proposal-worker-store.js';
|
|
5
|
+
export interface ActionProposalWorkerOptions {
|
|
6
|
+
store: ActionProposalStore & ActionProposalWorkerStore & ActionProposalOutcomeStore;
|
|
7
|
+
executor: ActionProposalExecutor;
|
|
8
|
+
workerId: string;
|
|
9
|
+
pollIntervalMs?: number;
|
|
10
|
+
leaseMs?: number;
|
|
11
|
+
maxConcurrency?: number;
|
|
12
|
+
onError?(error: unknown): void;
|
|
13
|
+
onSettled?(proposal: ActionProposal): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare class ActionProposalWorker {
|
|
16
|
+
private readonly options;
|
|
17
|
+
private readonly leaseMs;
|
|
18
|
+
private readonly pollIntervalMs;
|
|
19
|
+
private readonly maxConcurrency;
|
|
20
|
+
private timer?;
|
|
21
|
+
private stopped;
|
|
22
|
+
private readonly renewals;
|
|
23
|
+
private active;
|
|
24
|
+
constructor(options: ActionProposalWorkerOptions);
|
|
25
|
+
start(): void;
|
|
26
|
+
stop(): Promise<void>;
|
|
27
|
+
runOnce(): Promise<void>;
|
|
28
|
+
private tick;
|
|
29
|
+
private execute;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=action-proposal-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposal-worker.d.ts","sourceRoot":"","sources":["../../src/action-proposal-worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,mBAAmB,GAAG,yBAAyB,GAAG,0BAA0B,CAAC;IACpF,QAAQ,EAAE,sBAAsB,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AACD,qBAAa,oBAAoB;IAQnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,MAAM,CAA4B;IAC1C,YAA6B,OAAO,EAAE,2BAA2B,EAUhE;IACD,KAAK,IAAI,IAAI,CAYZ;IACK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAM1B;IACD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQvB;YACa,IAAI;YAqBJ,OAAO;CA8CtB"}
|