@jungjaehoon/mama-os 0.20.0 → 0.21.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 +48 -0
- package/dist/agent/agent-loop.d.ts +2 -1
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +65 -19
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/claude-cli-wrapper.d.ts.map +1 -1
- package/dist/agent/claude-cli-wrapper.js +6 -2
- package/dist/agent/claude-cli-wrapper.js.map +1 -1
- package/dist/agent/cli-arg-redaction.d.ts +2 -0
- package/dist/agent/cli-arg-redaction.d.ts.map +1 -0
- package/dist/agent/cli-arg-redaction.js +18 -0
- package/dist/agent/cli-arg-redaction.js.map +1 -0
- package/dist/agent/code-act/constants.d.ts +1 -1
- package/dist/agent/code-act/constants.d.ts.map +1 -1
- package/dist/agent/code-act/constants.js +24 -3
- package/dist/agent/code-act/constants.js.map +1 -1
- package/dist/agent/code-act/host-bridge.d.ts +2 -0
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +43 -7
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/code-act/type-definition-generator.d.ts +2 -2
- package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
- package/dist/agent/code-act/type-definition-generator.js +29 -4
- package/dist/agent/code-act/type-definition-generator.js.map +1 -1
- package/dist/agent/codex-home.d.ts +1 -1
- package/dist/agent/codex-home.d.ts.map +1 -1
- package/dist/agent/codex-home.js +43 -1
- package/dist/agent/codex-home.js.map +1 -1
- package/dist/agent/codex-mcp-process.d.ts +2 -0
- package/dist/agent/codex-mcp-process.d.ts.map +1 -1
- package/dist/agent/codex-mcp-process.js +1 -1
- package/dist/agent/codex-mcp-process.js.map +1 -1
- package/dist/agent/context-compile-service.d.ts +47 -0
- package/dist/agent/context-compile-service.d.ts.map +1 -0
- package/dist/agent/context-compile-service.js +435 -0
- package/dist/agent/context-compile-service.js.map +1 -0
- package/dist/agent/gateway-tool-executor.d.ts +16 -11
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +539 -109
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +4 -3
- package/dist/agent/mama-tool-handlers.d.ts.map +1 -1
- package/dist/agent/mama-tool-handlers.js +37 -1
- package/dist/agent/mama-tool-handlers.js.map +1 -1
- package/dist/agent/managed-agent-runtime-sync.d.ts.map +1 -1
- package/dist/agent/managed-agent-runtime-sync.js +2 -4
- package/dist/agent/managed-agent-runtime-sync.js.map +1 -1
- package/dist/agent/managed-agent-validation.d.ts.map +1 -1
- package/dist/agent/managed-agent-validation.js +2 -1
- package/dist/agent/managed-agent-validation.js.map +1 -1
- package/dist/agent/os-agent-capabilities.md +13 -12
- package/dist/agent/persistent-cli-process.d.ts +1 -0
- package/dist/agent/persistent-cli-process.d.ts.map +1 -1
- package/dist/agent/persistent-cli-process.js +6 -1
- package/dist/agent/persistent-cli-process.js.map +1 -1
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +10 -2
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +30 -5
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/agent-context-handler.d.ts +10 -0
- package/dist/api/agent-context-handler.d.ts.map +1 -0
- package/dist/api/agent-context-handler.js +216 -0
- package/dist/api/agent-context-handler.js.map +1 -0
- package/dist/api/agent-handler.d.ts +2 -0
- package/dist/api/agent-handler.d.ts.map +1 -1
- package/dist/api/agent-handler.js +14 -7
- package/dist/api/agent-handler.js.map +1 -1
- package/dist/api/graph-api-types.d.ts +6 -1
- package/dist/api/graph-api-types.d.ts.map +1 -1
- package/dist/api/graph-api.d.ts +2 -1
- package/dist/api/graph-api.d.ts.map +1 -1
- package/dist/api/graph-api.js +193 -11
- package/dist/api/graph-api.js.map +1 -1
- package/dist/api/index.d.ts +11 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +13 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/intelligence-handler.d.ts +17 -6
- package/dist/api/intelligence-handler.d.ts.map +1 -1
- package/dist/api/intelligence-handler.js +59 -1
- package/dist/api/intelligence-handler.js.map +1 -1
- package/dist/api/operator-handler.d.ts +17 -0
- package/dist/api/operator-handler.d.ts.map +1 -0
- package/dist/api/operator-handler.js +88 -0
- package/dist/api/operator-handler.js.map +1 -0
- package/dist/api/report-handler.d.ts +7 -0
- package/dist/api/report-handler.d.ts.map +1 -1
- package/dist/api/report-handler.js +30 -0
- package/dist/api/report-handler.js.map +1 -1
- package/dist/api/report-persistence.d.ts +17 -0
- package/dist/api/report-persistence.d.ts.map +1 -0
- package/dist/api/report-persistence.js +91 -0
- package/dist/api/report-persistence.js.map +1 -0
- package/dist/cli/commands/start.d.ts +45 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +610 -197
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/config-manager.d.ts.map +1 -1
- package/dist/cli/config/config-manager.js +171 -4
- package/dist/cli/config/config-manager.js.map +1 -1
- package/dist/cli/config/types.d.ts +25 -5
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +5 -0
- package/dist/cli/config/types.js.map +1 -1
- package/dist/cli/runtime/agent-loop-init.d.ts +3 -0
- package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
- package/dist/cli/runtime/agent-loop-init.js +2 -0
- package/dist/cli/runtime/agent-loop-init.js.map +1 -1
- package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-routes-init.js +396 -259
- package/dist/cli/runtime/api-routes-init.js.map +1 -1
- package/dist/cli/runtime/api-server-init.d.ts +2 -0
- package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-server-init.js +19 -8
- package/dist/cli/runtime/api-server-init.js.map +1 -1
- package/dist/cli/runtime/connector-init.d.ts +26 -7
- package/dist/cli/runtime/connector-init.d.ts.map +1 -1
- package/dist/cli/runtime/connector-init.js +79 -16
- package/dist/cli/runtime/connector-init.js.map +1 -1
- package/dist/cli/runtime/envelope-bootstrap.d.ts.map +1 -1
- package/dist/cli/runtime/envelope-bootstrap.js +8 -2
- package/dist/cli/runtime/envelope-bootstrap.js.map +1 -1
- package/dist/cli/runtime/gateway-init.d.ts +1 -1
- package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
- package/dist/cli/runtime/gateway-init.js.map +1 -1
- package/dist/cli/runtime/message-router-config.d.ts +4 -0
- package/dist/cli/runtime/message-router-config.d.ts.map +1 -0
- package/dist/cli/runtime/message-router-config.js +11 -0
- package/dist/cli/runtime/message-router-config.js.map +1 -0
- package/dist/cli/runtime/scheduler-init.d.ts.map +1 -1
- package/dist/cli/runtime/scheduler-init.js +12 -12
- package/dist/cli/runtime/scheduler-init.js.map +1 -1
- package/dist/cli/runtime/utilities.js +2 -2
- package/dist/cli/runtime/utilities.js.map +1 -1
- package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
- package/dist/connectors/framework/polling-scheduler.js +101 -5
- package/dist/connectors/framework/polling-scheduler.js.map +1 -1
- package/dist/connectors/kagemusha/query-tools.d.ts.map +1 -1
- package/dist/connectors/kagemusha/query-tools.js +14 -3
- package/dist/connectors/kagemusha/query-tools.js.map +1 -1
- package/dist/db/agent-store.d.ts.map +1 -1
- package/dist/db/agent-store.js +10 -3
- package/dist/db/agent-store.js.map +1 -1
- package/dist/db/migrations/wiki-artifacts.d.ts +3 -0
- package/dist/db/migrations/wiki-artifacts.d.ts.map +1 -0
- package/dist/db/migrations/wiki-artifacts.js +24 -0
- package/dist/db/migrations/wiki-artifacts.js.map +1 -0
- package/dist/envelope/enforcer.d.ts.map +1 -1
- package/dist/envelope/enforcer.js +48 -4
- package/dist/envelope/enforcer.js.map +1 -1
- package/dist/envelope/key-provider.d.ts +1 -0
- package/dist/envelope/key-provider.d.ts.map +1 -1
- package/dist/envelope/key-provider.js +86 -0
- package/dist/envelope/key-provider.js.map +1 -1
- package/dist/gateways/message-router.d.ts.map +1 -1
- package/dist/gateways/message-router.js +15 -3
- package/dist/gateways/message-router.js.map +1 -1
- package/dist/gateways/types.d.ts +5 -1
- package/dist/gateways/types.d.ts.map +1 -1
- package/dist/mcp/code-act-server.js +50 -7
- package/dist/mcp/code-act-server.js.map +1 -1
- package/dist/memory/raw-backed-memory-ingest.d.ts +26 -0
- package/dist/memory/raw-backed-memory-ingest.d.ts.map +1 -0
- package/dist/memory/raw-backed-memory-ingest.js +214 -0
- package/dist/memory/raw-backed-memory-ingest.js.map +1 -0
- package/dist/memory/scope-context.js +1 -1
- package/dist/multi-agent/agent-event-bus.d.ts +10 -0
- package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
- package/dist/multi-agent/agent-event-bus.js +34 -0
- package/dist/multi-agent/agent-event-bus.js.map +1 -1
- package/dist/multi-agent/agent-process-manager.d.ts +3 -0
- package/dist/multi-agent/agent-process-manager.d.ts.map +1 -1
- package/dist/multi-agent/agent-process-manager.js +118 -13
- package/dist/multi-agent/agent-process-manager.js.map +1 -1
- package/dist/multi-agent/conductor-persona.js +2 -2
- package/dist/multi-agent/dashboard-agent-persona.d.ts +6 -2
- package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
- package/dist/multi-agent/dashboard-agent-persona.js +57 -30
- package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
- package/dist/multi-agent/memory-agent-persona.d.ts +1 -1
- package/dist/multi-agent/memory-agent-persona.d.ts.map +1 -1
- package/dist/multi-agent/memory-agent-persona.js +25 -4
- package/dist/multi-agent/memory-agent-persona.js.map +1 -1
- package/dist/multi-agent/runtime-process.d.ts +1 -0
- package/dist/multi-agent/runtime-process.d.ts.map +1 -1
- package/dist/multi-agent/runtime-process.js +1 -0
- package/dist/multi-agent/runtime-process.js.map +1 -1
- package/dist/multi-agent/types.d.ts +14 -4
- package/dist/multi-agent/types.d.ts.map +1 -1
- package/dist/multi-agent/types.js.map +1 -1
- package/dist/multi-agent/wiki-agent-persona.d.ts +7 -1
- package/dist/multi-agent/wiki-agent-persona.d.ts.map +1 -1
- package/dist/multi-agent/wiki-agent-persona.js +83 -61
- package/dist/multi-agent/wiki-agent-persona.js.map +1 -1
- package/dist/multi-agent/workflow-types.d.ts +1 -1
- package/dist/multi-agent/workflow-types.d.ts.map +1 -1
- package/dist/operator/board-slot-instructions.d.ts +18 -0
- package/dist/operator/board-slot-instructions.d.ts.map +1 -0
- package/dist/operator/board-slot-instructions.js +52 -0
- package/dist/operator/board-slot-instructions.js.map +1 -0
- package/dist/operator/connector-delta-repo.d.ts +33 -0
- package/dist/operator/connector-delta-repo.d.ts.map +1 -0
- package/dist/operator/connector-delta-repo.js +0 -0
- package/dist/operator/connector-delta-repo.js.map +1 -0
- package/dist/operator/mama-memory-port.d.ts +13 -0
- package/dist/operator/mama-memory-port.d.ts.map +1 -0
- package/dist/operator/mama-memory-port.js +35 -0
- package/dist/operator/mama-memory-port.js.map +1 -0
- package/dist/operator/operator-interfaces.d.ts +136 -0
- package/dist/operator/operator-interfaces.d.ts.map +1 -0
- package/dist/operator/operator-interfaces.js +15 -0
- package/dist/operator/operator-interfaces.js.map +1 -0
- package/dist/operator/operator-trigger-loop.d.ts +106 -0
- package/dist/operator/operator-trigger-loop.d.ts.map +1 -0
- package/dist/operator/operator-trigger-loop.js +228 -0
- package/dist/operator/operator-trigger-loop.js.map +1 -0
- package/dist/operator/report-run.d.ts +78 -0
- package/dist/operator/report-run.d.ts.map +1 -0
- package/dist/operator/report-run.js +141 -0
- package/dist/operator/report-run.js.map +1 -0
- package/dist/operator/report-scheduler.d.ts +43 -0
- package/dist/operator/report-scheduler.d.ts.map +1 -0
- package/dist/operator/report-scheduler.js +87 -0
- package/dist/operator/report-scheduler.js.map +1 -0
- package/dist/operator/situation-report.d.ts +86 -0
- package/dist/operator/situation-report.d.ts.map +1 -0
- package/dist/operator/situation-report.js +211 -0
- package/dist/operator/situation-report.js.map +1 -0
- package/dist/operator/trigger-author.d.ts +45 -0
- package/dist/operator/trigger-author.d.ts.map +1 -0
- package/dist/operator/trigger-author.js +217 -0
- package/dist/operator/trigger-author.js.map +1 -0
- package/dist/operator/trigger-evolve.d.ts +31 -0
- package/dist/operator/trigger-evolve.d.ts.map +1 -0
- package/dist/operator/trigger-evolve.js +51 -0
- package/dist/operator/trigger-evolve.js.map +1 -0
- package/dist/operator/trigger-fire.d.ts +29 -0
- package/dist/operator/trigger-fire.d.ts.map +1 -0
- package/dist/operator/trigger-fire.js +41 -0
- package/dist/operator/trigger-fire.js.map +1 -0
- package/dist/operator/trigger-matcher.d.ts +19 -0
- package/dist/operator/trigger-matcher.d.ts.map +1 -0
- package/dist/operator/trigger-matcher.js +61 -0
- package/dist/operator/trigger-matcher.js.map +1 -0
- package/dist/operator/trigger-registry.d.ts +36 -0
- package/dist/operator/trigger-registry.d.ts.map +1 -0
- package/dist/operator/trigger-registry.js +135 -0
- package/dist/operator/trigger-registry.js.map +1 -0
- package/dist/operator/trigger-review.d.ts +23 -0
- package/dist/operator/trigger-review.d.ts.map +1 -0
- package/dist/operator/trigger-review.js +127 -0
- package/dist/operator/trigger-review.js.map +1 -0
- package/dist/operator/trigger-types.d.ts +84 -0
- package/dist/operator/trigger-types.d.ts.map +1 -0
- package/dist/operator/trigger-types.js +14 -0
- package/dist/operator/trigger-types.js.map +1 -0
- package/dist/scheduler/cron-worker.d.ts.map +1 -1
- package/dist/scheduler/cron-worker.js +3 -1
- package/dist/scheduler/cron-worker.js.map +1 -1
- package/dist/security/security-monitor.d.ts.map +1 -1
- package/dist/security/security-monitor.js +1 -0
- package/dist/security/security-monitor.js.map +1 -1
- package/dist/wiki/obsidian-writer.d.ts +1 -1
- package/dist/wiki/obsidian-writer.d.ts.map +1 -1
- package/dist/wiki/obsidian-writer.js +67 -27
- package/dist/wiki/obsidian-writer.js.map +1 -1
- package/dist/wiki/path-safety.d.ts +2 -0
- package/dist/wiki/path-safety.d.ts.map +1 -0
- package/dist/wiki/path-safety.js +40 -0
- package/dist/wiki/path-safety.js.map +1 -0
- package/dist/wiki/types.d.ts +4 -2
- package/dist/wiki/types.d.ts.map +1 -1
- package/dist/wiki/types.js +1 -1
- package/dist/wiki/types.js.map +1 -1
- package/dist/wiki-artifacts/normalization.d.ts +8 -0
- package/dist/wiki-artifacts/normalization.d.ts.map +1 -0
- package/dist/wiki-artifacts/normalization.js +41 -0
- package/dist/wiki-artifacts/normalization.js.map +1 -0
- package/dist/wiki-artifacts/types.d.ts +52 -0
- package/dist/wiki-artifacts/types.d.ts.map +1 -0
- package/dist/wiki-artifacts/types.js +3 -0
- package/dist/wiki-artifacts/types.js.map +1 -0
- package/dist/wiki-artifacts/wiki-publish-adapter.d.ts +14 -0
- package/dist/wiki-artifacts/wiki-publish-adapter.d.ts.map +1 -0
- package/dist/wiki-artifacts/wiki-publish-adapter.js +71 -0
- package/dist/wiki-artifacts/wiki-publish-adapter.js.map +1 -0
- package/package.json +6 -4
- package/public/ui/assets/index-BDsaQNGd.js +62 -0
- package/public/ui/assets/index-C4URnm_X.css +1 -0
- package/public/ui/index.html +13 -0
- package/public/viewer/js/utils/api.js +2 -2
- package/public/viewer/src/utils/api.ts +9 -2
- package/public/viewer/sw.js +1 -1
- package/public/viewer/viewer.html +6 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trigger-author - Task 3, the heart (G1 + G3).
|
|
3
|
+
*
|
|
4
|
+
* The agent recognizes a recurring situation in a window of polled events and AUTHORS a
|
|
5
|
+
* trigger (its match keywords, memoryQuery, procedure, requiredEvidence). This replaces both
|
|
6
|
+
* Kagemusha's hardcoded regex markers (G1) and its 4-profile executable catalog (G3).
|
|
7
|
+
*
|
|
8
|
+
* The agent is injected (`AskAgent`) so the flow is deterministic + unit-testable; the real
|
|
9
|
+
* claude-CLI agent is `askAgentCLI`, exercised by the LLM eval.
|
|
10
|
+
*
|
|
11
|
+
* G3 GUARD: validation is STRUCTURAL only. `kind` and `procedure[].action` are open strings;
|
|
12
|
+
* unknown VALUES are accepted. Never narrow them to a fixed enum - that re-freezes G3.
|
|
13
|
+
*/
|
|
14
|
+
import type { OperatorChannelEvent } from './operator-interfaces.js';
|
|
15
|
+
import type { TriggerRecord } from './trigger-types.js';
|
|
16
|
+
import type { TriggerRegistry } from './trigger-registry.js';
|
|
17
|
+
/** Injected agent: prompt in, raw text answer out. */
|
|
18
|
+
export type AskAgent = (prompt: string) => Promise<string>;
|
|
19
|
+
/** What the agent returns (a CreateTriggerInput minus server-managed fields). */
|
|
20
|
+
export interface TriggerSpec {
|
|
21
|
+
id?: string;
|
|
22
|
+
kind: string;
|
|
23
|
+
memoryQuery: string;
|
|
24
|
+
match: {
|
|
25
|
+
keywords: string[];
|
|
26
|
+
keywordMode: 'any' | 'every';
|
|
27
|
+
scopeChannelIds?: string[];
|
|
28
|
+
minConfidence: number;
|
|
29
|
+
};
|
|
30
|
+
procedure: {
|
|
31
|
+
action: string;
|
|
32
|
+
description: string;
|
|
33
|
+
}[];
|
|
34
|
+
requiredEvidence: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface AuthorOptions {
|
|
37
|
+
note?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function authorTriggers(events: OperatorChannelEvent[], registry: TriggerRegistry, askAgent: AskAgent, opts?: AuthorOptions): Promise<TriggerRecord[]>;
|
|
40
|
+
export declare function buildAuthorPrompt(events: OperatorChannelEvent[], existing: TriggerRecord[]): string;
|
|
41
|
+
export declare function parseTriggerSpecs(text: string): TriggerSpec[];
|
|
42
|
+
export declare function validateTriggerSpec(spec: unknown): TriggerSpec;
|
|
43
|
+
/** Real agent: the local claude CLI (CLI-over-API). Used by the LLM eval, not unit tests. */
|
|
44
|
+
export declare const askAgentCLI: AskAgent;
|
|
45
|
+
//# sourceMappingURL=trigger-author.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-author.d.ts","sourceRoot":"","sources":["../../src/operator/trigger-author.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,sDAAsD;AACtD,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE3D,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,WAAW,EAAE,KAAK,GAAG,OAAO,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,EAAE,EAC9B,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CA6B1B;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,oBAAoB,EAAE,EAC9B,QAAQ,EAAE,aAAa,EAAE,GACxB,MAAM,CAsCR;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAW7D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CA2D9D;AAED,6FAA6F;AAC7F,eAAO,MAAM,WAAW,EAAE,QAOzB,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* trigger-author - Task 3, the heart (G1 + G3).
|
|
4
|
+
*
|
|
5
|
+
* The agent recognizes a recurring situation in a window of polled events and AUTHORS a
|
|
6
|
+
* trigger (its match keywords, memoryQuery, procedure, requiredEvidence). This replaces both
|
|
7
|
+
* Kagemusha's hardcoded regex markers (G1) and its 4-profile executable catalog (G3).
|
|
8
|
+
*
|
|
9
|
+
* The agent is injected (`AskAgent`) so the flow is deterministic + unit-testable; the real
|
|
10
|
+
* claude-CLI agent is `askAgentCLI`, exercised by the LLM eval.
|
|
11
|
+
*
|
|
12
|
+
* G3 GUARD: validation is STRUCTURAL only. `kind` and `procedure[].action` are open strings;
|
|
13
|
+
* unknown VALUES are accepted. Never narrow them to a fixed enum - that re-freezes G3.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.askAgentCLI = void 0;
|
|
17
|
+
exports.authorTriggers = authorTriggers;
|
|
18
|
+
exports.buildAuthorPrompt = buildAuthorPrompt;
|
|
19
|
+
exports.parseTriggerSpecs = parseTriggerSpecs;
|
|
20
|
+
exports.validateTriggerSpec = validateTriggerSpec;
|
|
21
|
+
const node_crypto_1 = require("node:crypto");
|
|
22
|
+
const node_child_process_1 = require("node:child_process");
|
|
23
|
+
const node_util_1 = require("node:util");
|
|
24
|
+
const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
|
|
25
|
+
async function authorTriggers(events, registry, askAgent, opts = {}) {
|
|
26
|
+
const existing = registry.listActive();
|
|
27
|
+
const prompt = buildAuthorPrompt(events, existing);
|
|
28
|
+
const answer = await askAgent(prompt);
|
|
29
|
+
const specs = parseTriggerSpecs(answer); // throws on unparseable output (no-fallback)
|
|
30
|
+
const created = [];
|
|
31
|
+
const seen = existing.map((t) => ({
|
|
32
|
+
keywords: t.match.keywords,
|
|
33
|
+
scopeChannelIds: t.match.scopeChannelIds,
|
|
34
|
+
}));
|
|
35
|
+
for (const spec of specs) {
|
|
36
|
+
if (isDuplicate(spec, seen))
|
|
37
|
+
continue;
|
|
38
|
+
const id = spec.id ?? deriveId(spec);
|
|
39
|
+
if (registry.getById(id))
|
|
40
|
+
continue;
|
|
41
|
+
const input = {
|
|
42
|
+
id,
|
|
43
|
+
kind: spec.kind,
|
|
44
|
+
memoryQuery: spec.memoryQuery,
|
|
45
|
+
match: spec.match,
|
|
46
|
+
procedure: spec.procedure,
|
|
47
|
+
requiredEvidence: spec.requiredEvidence,
|
|
48
|
+
authoredBy: 'agent',
|
|
49
|
+
provenance: { createdFrom: 'agent-authored', note: opts.note ?? '' },
|
|
50
|
+
};
|
|
51
|
+
created.push(registry.create(input));
|
|
52
|
+
seen.push({ keywords: spec.match.keywords, scopeChannelIds: spec.match.scopeChannelIds });
|
|
53
|
+
}
|
|
54
|
+
return created;
|
|
55
|
+
}
|
|
56
|
+
function buildAuthorPrompt(events, existing) {
|
|
57
|
+
// English default. Personal phrasing overrides load from ~/.mama/operator/*.json (later refinement).
|
|
58
|
+
const window = events.map((e) => `- [${e.channelId}] ${e.content}`).join('\n');
|
|
59
|
+
const existingList = existing.length === 0
|
|
60
|
+
? '(none yet)'
|
|
61
|
+
: existing
|
|
62
|
+
.map((t) => `- ${t.id}: keywords=[${t.match.keywords.join(', ')}] memoryQuery="${t.memoryQuery}"`)
|
|
63
|
+
.join('\n');
|
|
64
|
+
return [
|
|
65
|
+
"You maintain a personal operator's library of TRIGGERS. A trigger fires on future messages",
|
|
66
|
+
'that match its keywords and then recalls a memory to help the operator intervene proactively.',
|
|
67
|
+
'',
|
|
68
|
+
'Look at the recent messages below. Propose new triggers ONLY for situations that genuinely',
|
|
69
|
+
'RECUR (appear repeatedly, possibly phrased differently). Do NOT create triggers for one-off',
|
|
70
|
+
'messages. If nothing recurs, return an empty array.',
|
|
71
|
+
'',
|
|
72
|
+
'Recent messages:',
|
|
73
|
+
window,
|
|
74
|
+
'',
|
|
75
|
+
'Existing triggers (do not duplicate these):',
|
|
76
|
+
existingList,
|
|
77
|
+
'',
|
|
78
|
+
'A situation already covered by an existing trigger -- even with different wording or a',
|
|
79
|
+
'partial keyword overlap -- does NOT need a new trigger. Near-variants make several',
|
|
80
|
+
'triggers fire on the same message, which wastes recall and dilutes the report. Prefer',
|
|
81
|
+
'proposing NOTHING over proposing a variant of an existing trigger.',
|
|
82
|
+
'',
|
|
83
|
+
'Return ONLY a JSON array (no prose) of trigger objects with this shape:',
|
|
84
|
+
'[{ "kind": string, "memoryQuery": string,',
|
|
85
|
+
' "match": { "keywords": string[], "keywordMode": "any"|"every", "minConfidence": number },',
|
|
86
|
+
' "procedure": [{ "action": string, "description": string }],',
|
|
87
|
+
' "requiredEvidence": string[] }]',
|
|
88
|
+
'kind and action are free text you choose - describe the situation and steps in your own words.',
|
|
89
|
+
].join('\n');
|
|
90
|
+
}
|
|
91
|
+
function parseTriggerSpecs(text) {
|
|
92
|
+
const arr = extractJsonArray(stripCodeFences(text));
|
|
93
|
+
if (arr === null)
|
|
94
|
+
throw new Error('agent output contained no JSON array of trigger specs');
|
|
95
|
+
let parsed;
|
|
96
|
+
try {
|
|
97
|
+
parsed = JSON.parse(arr);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw new Error(`agent trigger JSON did not parse: ${error.message}`);
|
|
101
|
+
}
|
|
102
|
+
if (!Array.isArray(parsed))
|
|
103
|
+
throw new Error('agent trigger JSON was not an array');
|
|
104
|
+
return parsed.map(validateTriggerSpec);
|
|
105
|
+
}
|
|
106
|
+
function validateTriggerSpec(spec) {
|
|
107
|
+
if (!isObject(spec))
|
|
108
|
+
throw new Error('trigger spec must be an object');
|
|
109
|
+
const nonEmptyString = (v) => typeof v === 'string' && v.trim() !== '';
|
|
110
|
+
if (!nonEmptyString(spec.kind))
|
|
111
|
+
throw new Error('trigger.kind must be a non-empty string');
|
|
112
|
+
if (!nonEmptyString(spec.memoryQuery))
|
|
113
|
+
throw new Error('trigger.memoryQuery must be a non-empty string');
|
|
114
|
+
if (!isObject(spec.match))
|
|
115
|
+
throw new Error('trigger.match must be an object');
|
|
116
|
+
const match = spec.match;
|
|
117
|
+
if (!Array.isArray(match.keywords) ||
|
|
118
|
+
match.keywords.length === 0 ||
|
|
119
|
+
!match.keywords.every(nonEmptyString)) {
|
|
120
|
+
throw new Error('trigger.match.keywords must be a non-empty string[]');
|
|
121
|
+
}
|
|
122
|
+
if (match.keywordMode !== 'any' && match.keywordMode !== 'every') {
|
|
123
|
+
throw new Error("trigger.match.keywordMode must be 'any' or 'every'");
|
|
124
|
+
}
|
|
125
|
+
if (typeof match.minConfidence !== 'number')
|
|
126
|
+
throw new Error('trigger.match.minConfidence must be a number');
|
|
127
|
+
if (match.scopeChannelIds !== undefined &&
|
|
128
|
+
(!Array.isArray(match.scopeChannelIds) ||
|
|
129
|
+
!match.scopeChannelIds.every((c) => typeof c === 'string'))) {
|
|
130
|
+
throw new Error('trigger.match.scopeChannelIds must be string[] when present');
|
|
131
|
+
}
|
|
132
|
+
if (!Array.isArray(spec.procedure) ||
|
|
133
|
+
!spec.procedure.every((p) => isObject(p) && typeof p.action === 'string' && typeof p.description === 'string')) {
|
|
134
|
+
throw new Error('trigger.procedure must be an array of {action, description}');
|
|
135
|
+
}
|
|
136
|
+
if (!Array.isArray(spec.requiredEvidence) ||
|
|
137
|
+
!spec.requiredEvidence.every((e) => typeof e === 'string')) {
|
|
138
|
+
throw new Error('trigger.requiredEvidence must be string[]');
|
|
139
|
+
}
|
|
140
|
+
// Deliberately NO check of kind/action VALUES against any catalog (G3 guard).
|
|
141
|
+
return {
|
|
142
|
+
id: typeof spec.id === 'string' ? spec.id : undefined,
|
|
143
|
+
kind: spec.kind,
|
|
144
|
+
memoryQuery: spec.memoryQuery,
|
|
145
|
+
match: {
|
|
146
|
+
keywords: match.keywords,
|
|
147
|
+
keywordMode: match.keywordMode,
|
|
148
|
+
minConfidence: match.minConfidence,
|
|
149
|
+
scopeChannelIds: match.scopeChannelIds,
|
|
150
|
+
},
|
|
151
|
+
procedure: spec.procedure,
|
|
152
|
+
requiredEvidence: spec.requiredEvidence,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** Real agent: the local claude CLI (CLI-over-API). Used by the LLM eval, not unit tests. */
|
|
156
|
+
const askAgentCLI = async (prompt) => {
|
|
157
|
+
const { stdout } = await execFileAsync('claude', ['-p', prompt, '--output-format', 'json'], {
|
|
158
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
159
|
+
});
|
|
160
|
+
const parsed = JSON.parse(stdout);
|
|
161
|
+
if (parsed.type === 'result' && typeof parsed.result === 'string')
|
|
162
|
+
return parsed.result;
|
|
163
|
+
throw new Error('claude CLI did not return a text result');
|
|
164
|
+
};
|
|
165
|
+
exports.askAgentCLI = askAgentCLI;
|
|
166
|
+
// ---- helpers ----
|
|
167
|
+
function isObject(value) {
|
|
168
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
169
|
+
}
|
|
170
|
+
function stripCodeFences(text) {
|
|
171
|
+
return text.replace(/```(?:json)?/gi, '');
|
|
172
|
+
}
|
|
173
|
+
function extractJsonArray(text) {
|
|
174
|
+
const start = text.indexOf('[');
|
|
175
|
+
const end = text.lastIndexOf(']');
|
|
176
|
+
if (start === -1 || end === -1 || end < start)
|
|
177
|
+
return null;
|
|
178
|
+
return text.slice(start, end + 1);
|
|
179
|
+
}
|
|
180
|
+
function normalizedKeywordSet(keywords) {
|
|
181
|
+
return [...new Set(keywords.map((k) => k.trim().toLocaleLowerCase()))].sort().join('|');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Near-duplicate gate. Exact keyword-set equality alone let near-variants pile
|
|
185
|
+
* up: day-1 live data showed 65% of fires were co-fires of overlapping triggers
|
|
186
|
+
* on the same message. Within the same scope, a spec is a duplicate when its
|
|
187
|
+
* keyword set is a subset/superset of an existing trigger's, or the Jaccard
|
|
188
|
+
* overlap is >= 0.6. This is authoring HYGIENE (like the exact check before
|
|
189
|
+
* it), not outcome judgment -- keep/retire decisions stay with the agent (G2).
|
|
190
|
+
*/
|
|
191
|
+
function isDuplicate(spec, seen) {
|
|
192
|
+
const specKeys = new Set(spec.match.keywords.map((k) => k.trim().toLowerCase()).filter(Boolean));
|
|
193
|
+
const specScope = (spec.match.scopeChannelIds ?? []).slice().sort().join(',');
|
|
194
|
+
return seen.some((s) => {
|
|
195
|
+
if ((s.scopeChannelIds ?? []).slice().sort().join(',') !== specScope)
|
|
196
|
+
return false;
|
|
197
|
+
const seenKeys = new Set(s.keywords.map((k) => k.trim().toLowerCase()).filter(Boolean));
|
|
198
|
+
if (specKeys.size === 0 || seenKeys.size === 0)
|
|
199
|
+
return false;
|
|
200
|
+
let shared = 0;
|
|
201
|
+
for (const k of specKeys)
|
|
202
|
+
if (seenKeys.has(k))
|
|
203
|
+
shared += 1;
|
|
204
|
+
if (shared === specKeys.size || shared === seenKeys.size)
|
|
205
|
+
return true; // subset either way
|
|
206
|
+
const jaccard = shared / (specKeys.size + seenKeys.size - shared);
|
|
207
|
+
return jaccard >= 0.6;
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function deriveId(spec) {
|
|
211
|
+
const hash = (0, node_crypto_1.createHash)('sha256')
|
|
212
|
+
.update(`${spec.kind}\n${normalizedKeywordSet(spec.match.keywords)}`)
|
|
213
|
+
.digest('hex')
|
|
214
|
+
.slice(0, 12);
|
|
215
|
+
return `trigger.${hash}`;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=trigger-author.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-author.js","sourceRoot":"","sources":["../../src/operator/trigger-author.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* evolveTrigger - Task 4, G2 (the learning Kagemusha deferred forever).
|
|
3
|
+
*
|
|
4
|
+
* An intervention outcome (succeeded / failed / corrected) is fed to the trigger's stats,
|
|
5
|
+
* then the AGENT decides whether to keep, refine, or retire the trigger. The decision is
|
|
6
|
+
* INJECTED (`decide`) - the real one is an LLM call. There is deliberately NO numeric
|
|
7
|
+
* threshold in this module: a fixed `if (failed >= N) disable()` would be exactly the
|
|
8
|
+
* automation trap that re-freezes G2. The same stats can be kept or retired by judgment.
|
|
9
|
+
*/
|
|
10
|
+
import type { TriggerRegistry } from './trigger-registry.js';
|
|
11
|
+
import type { TriggerRecord } from './trigger-types.js';
|
|
12
|
+
import type { TriggerSpec } from './trigger-author.js';
|
|
13
|
+
export type EvolutionOutcome = 'succeeded' | 'failed' | 'corrected';
|
|
14
|
+
export type EvolutionAction = 'kept' | 'refined' | 'retired';
|
|
15
|
+
export type EvolutionDecision = {
|
|
16
|
+
action: 'kept';
|
|
17
|
+
} | {
|
|
18
|
+
action: 'retired';
|
|
19
|
+
reason: string;
|
|
20
|
+
} | {
|
|
21
|
+
action: 'refined';
|
|
22
|
+
reason: string;
|
|
23
|
+
newSpec: TriggerSpec;
|
|
24
|
+
};
|
|
25
|
+
export type DecideEvolution = (ctx: {
|
|
26
|
+
trigger: TriggerRecord;
|
|
27
|
+
outcome: EvolutionOutcome;
|
|
28
|
+
detail: string;
|
|
29
|
+
}) => Promise<EvolutionDecision>;
|
|
30
|
+
export declare function evolveTrigger(triggerId: string, outcome: EvolutionOutcome, detail: string, registry: TriggerRegistry, decide: DecideEvolution): Promise<EvolutionAction>;
|
|
31
|
+
//# sourceMappingURL=trigger-evolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-evolve.d.ts","sourceRoot":"","sources":["../../src/operator/trigger-evolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AACpE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAClC,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEjC,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,CAAC,CAkC1B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* evolveTrigger - Task 4, G2 (the learning Kagemusha deferred forever).
|
|
4
|
+
*
|
|
5
|
+
* An intervention outcome (succeeded / failed / corrected) is fed to the trigger's stats,
|
|
6
|
+
* then the AGENT decides whether to keep, refine, or retire the trigger. The decision is
|
|
7
|
+
* INJECTED (`decide`) - the real one is an LLM call. There is deliberately NO numeric
|
|
8
|
+
* threshold in this module: a fixed `if (failed >= N) disable()` would be exactly the
|
|
9
|
+
* automation trap that re-freezes G2. The same stats can be kept or retired by judgment.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.evolveTrigger = evolveTrigger;
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
async function evolveTrigger(triggerId, outcome, detail, registry, decide) {
|
|
15
|
+
// Feed the outcome into the stats (the G2 signal). 'corrected' counts as the current form failing.
|
|
16
|
+
registry.recordOutcome(triggerId, outcome === 'succeeded' ? 'succeeded' : 'failed');
|
|
17
|
+
const trigger = registry.getById(triggerId);
|
|
18
|
+
if (!trigger)
|
|
19
|
+
throw new Error(`evolveTrigger: no trigger with id ${triggerId}`);
|
|
20
|
+
// Keep / refine / retire is the AGENT's judgment (injected). No threshold constant here (G2 guard).
|
|
21
|
+
const decision = await decide({ trigger, outcome, detail });
|
|
22
|
+
if (decision.action === 'retired') {
|
|
23
|
+
registry.disable(triggerId, decision.reason);
|
|
24
|
+
return 'retired';
|
|
25
|
+
}
|
|
26
|
+
if (decision.action === 'refined') {
|
|
27
|
+
registry.disable(triggerId, `refined: ${decision.reason}`);
|
|
28
|
+
const spec = decision.newSpec;
|
|
29
|
+
const id = spec.id ?? `${triggerId}.r.${refineHash(spec)}`;
|
|
30
|
+
const input = {
|
|
31
|
+
id,
|
|
32
|
+
kind: spec.kind,
|
|
33
|
+
memoryQuery: spec.memoryQuery,
|
|
34
|
+
match: spec.match,
|
|
35
|
+
procedure: spec.procedure,
|
|
36
|
+
requiredEvidence: spec.requiredEvidence,
|
|
37
|
+
authoredBy: 'agent',
|
|
38
|
+
provenance: { createdFrom: `refined-from:${triggerId}`, note: decision.reason },
|
|
39
|
+
};
|
|
40
|
+
registry.create(input);
|
|
41
|
+
return 'refined';
|
|
42
|
+
}
|
|
43
|
+
return 'kept';
|
|
44
|
+
}
|
|
45
|
+
function refineHash(spec) {
|
|
46
|
+
return (0, node_crypto_1.createHash)('sha256')
|
|
47
|
+
.update(`${spec.kind}\n${spec.match.keywords.join('|')}`)
|
|
48
|
+
.digest('hex')
|
|
49
|
+
.slice(0, 8);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=trigger-evolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-evolve.js","sourceRoot":"","sources":["../../src/operator/trigger-evolve.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAqBH,sCAwCC;AA3DD,6CAAyC;AAmBlC,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,OAAyB,EACzB,MAAc,EACd,QAAyB,EACzB,MAAuB;IAEvB,mGAAmG;IACnG,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEpF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;IAEhF,oGAAoG;IACpG,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5D,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAuB;YAChC,EAAE;YACF,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,UAAU,EAAE,OAAO;YACnB,UAAU,EAAE,EAAE,WAAW,EAAE,gBAAgB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE;SAChF,CAAC;QACF,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB;IACnC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;SACxD,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fireTrigger - the proactive intervention: a fired TriggerSignal recalls its
|
|
3
|
+
* agent-authored memoryQuery (mama-core) and gathers requiredEvidence, then surfaces
|
|
4
|
+
* both to the agent. Read-only and self-activating (G4): no human gate, no outward send.
|
|
5
|
+
*
|
|
6
|
+
* This is "memory triggered like a skill" - the agent's memoryQuery decides what is
|
|
7
|
+
* recalled; the recall itself is a mechanical system assist.
|
|
8
|
+
*/
|
|
9
|
+
import type { OperatorMemoryPort } from './operator-interfaces.js';
|
|
10
|
+
import type { TriggerSignal } from './trigger-types.js';
|
|
11
|
+
/** Resolver for a requiredEvidence key the operator can supply (channel_history, task_state, ...). */
|
|
12
|
+
export type EvidenceProvider = () => Promise<unknown>;
|
|
13
|
+
export interface FireResult {
|
|
14
|
+
recalled: {
|
|
15
|
+
topic: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}[];
|
|
18
|
+
evidence: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface FireOptions {
|
|
21
|
+
limit?: number;
|
|
22
|
+
/** Observability hook - every fire is surfaced here (log + alarm at integration). */
|
|
23
|
+
onFire?: (info: {
|
|
24
|
+
signal: TriggerSignal;
|
|
25
|
+
result: FireResult;
|
|
26
|
+
}) => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function fireTrigger(signal: TriggerSignal, memory: OperatorMemoryPort, evidenceProviders?: Record<string, EvidenceProvider>, opts?: FireOptions): Promise<FireResult>;
|
|
29
|
+
//# sourceMappingURL=trigger-fire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-fire.d.ts","sourceRoot":"","sources":["../../src/operator/trigger-fire.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,sGAAsG;AACtG,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;CACxE;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAM,EACxD,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CA6BrB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* fireTrigger - the proactive intervention: a fired TriggerSignal recalls its
|
|
4
|
+
* agent-authored memoryQuery (mama-core) and gathers requiredEvidence, then surfaces
|
|
5
|
+
* both to the agent. Read-only and self-activating (G4): no human gate, no outward send.
|
|
6
|
+
*
|
|
7
|
+
* This is "memory triggered like a skill" - the agent's memoryQuery decides what is
|
|
8
|
+
* recalled; the recall itself is a mechanical system assist.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.fireTrigger = fireTrigger;
|
|
12
|
+
async function fireTrigger(signal, memory, evidenceProviders = {}, opts = {}) {
|
|
13
|
+
const bundle = await memory.recall(signal.memoryQuery, { limit: opts.limit ?? 5 });
|
|
14
|
+
const recalled = bundle.map((record) => ({ topic: record.topic, content: record.content }));
|
|
15
|
+
const evidence = {};
|
|
16
|
+
for (const key of signal.requiredEvidence) {
|
|
17
|
+
if (key === 'current_message') {
|
|
18
|
+
evidence[key] = signal.text;
|
|
19
|
+
}
|
|
20
|
+
else if (evidenceProviders[key]) {
|
|
21
|
+
// Component isolation (PR #119 review): evidence is auxiliary surface data - one
|
|
22
|
+
// throwing provider must not abort the whole tick (uncommitted deltas would re-fire
|
|
23
|
+
// every signal next tick). The failure is surfaced IN the evidence handed to the
|
|
24
|
+
// agent, never swallowed silently.
|
|
25
|
+
try {
|
|
26
|
+
evidence[key] = await evidenceProviders[key]();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
evidence[key] = `(evidence provider "${key}" failed: ${error instanceof Error ? error.message : String(error)})`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Not available. Surface honestly as null rather than guessing (no-fallback).
|
|
34
|
+
evidence[key] = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const result = { recalled, evidence };
|
|
38
|
+
opts.onFire?.({ signal, result });
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=trigger-fire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-fire.js","sourceRoot":"","sources":["../../src/operator/trigger-fire.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAmBH,kCAkCC;AAlCM,KAAK,UAAU,WAAW,CAC/B,MAAqB,EACrB,MAA0B,EAC1B,oBAAsD,EAAE,EACxD,OAAoB,EAAE;IAEtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE5F,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC1C,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC;aAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,iFAAiF;YACjF,oFAAoF;YACpF,iFAAiF;YACjF,mCAAmC;YACnC,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,GAAG,CAAC,GAAG,uBAAuB,GAAG,aACxC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,GAAG,CAAC;YACN,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8EAA8E;YAC9E,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* matchTriggers - registry-driven trigger matching (system-assist).
|
|
3
|
+
*
|
|
4
|
+
* Ports Kagemusha `workflowMatchesMessage`
|
|
5
|
+
* (~/project/mama-suite/apps/kagemusha/src/agent/contracts/workflow-situation-detector.ts:42):
|
|
6
|
+
* keyword any/every + scope filter. Deliberately DROPS two things:
|
|
7
|
+
* - the `approvedAt`/`approvedBy` human-approval gate (`:43`) -> triggers self-activate (G4).
|
|
8
|
+
* - the per-kind special-case (`:46` feedback_artifact_followup + hasConcreteFeedbackArtifactSignal)
|
|
9
|
+
* -> that is a hardcoded marker (G1) and carries chatwork:/slack: PII. This matcher has
|
|
10
|
+
* ZERO per-kind branches; a trigger matches purely on its agent-authored keywords + scope.
|
|
11
|
+
*
|
|
12
|
+
* The keywords were authored by the agent (trigger-author.ts); mechanically checking them
|
|
13
|
+
* is a legitimate system assist, not judgment.
|
|
14
|
+
*/
|
|
15
|
+
import type { OperatorChannelEvent } from './operator-interfaces.js';
|
|
16
|
+
import type { TriggerSignal } from './trigger-types.js';
|
|
17
|
+
import type { TriggerRegistry } from './trigger-registry.js';
|
|
18
|
+
export declare function matchTriggers(event: OperatorChannelEvent, registry: TriggerRegistry): TriggerSignal[];
|
|
19
|
+
//# sourceMappingURL=trigger-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-matcher.d.ts","sourceRoot":"","sources":["../../src/operator/trigger-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,wBAAgB,aAAa,CAAC,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,GAAG,aAAa,EAAE,CAerG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* matchTriggers - registry-driven trigger matching (system-assist).
|
|
4
|
+
*
|
|
5
|
+
* Ports Kagemusha `workflowMatchesMessage`
|
|
6
|
+
* (~/project/mama-suite/apps/kagemusha/src/agent/contracts/workflow-situation-detector.ts:42):
|
|
7
|
+
* keyword any/every + scope filter. Deliberately DROPS two things:
|
|
8
|
+
* - the `approvedAt`/`approvedBy` human-approval gate (`:43`) -> triggers self-activate (G4).
|
|
9
|
+
* - the per-kind special-case (`:46` feedback_artifact_followup + hasConcreteFeedbackArtifactSignal)
|
|
10
|
+
* -> that is a hardcoded marker (G1) and carries chatwork:/slack: PII. This matcher has
|
|
11
|
+
* ZERO per-kind branches; a trigger matches purely on its agent-authored keywords + scope.
|
|
12
|
+
*
|
|
13
|
+
* The keywords were authored by the agent (trigger-author.ts); mechanically checking them
|
|
14
|
+
* is a legitimate system assist, not judgment.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.matchTriggers = matchTriggers;
|
|
18
|
+
function matchTriggers(event, registry) {
|
|
19
|
+
// The operator reacts to incoming messages, not its own output (ports detector role check,
|
|
20
|
+
// workflow-situation-detector.ts:13).
|
|
21
|
+
if (event.role !== 'user')
|
|
22
|
+
return [];
|
|
23
|
+
const text = event.content.trim();
|
|
24
|
+
if (!text)
|
|
25
|
+
return [];
|
|
26
|
+
const signals = [];
|
|
27
|
+
for (const trigger of registry.listActive()) {
|
|
28
|
+
if (triggerMatchesEvent(trigger, event, text)) {
|
|
29
|
+
signals.push(buildSignal(trigger, event, text));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return signals;
|
|
33
|
+
}
|
|
34
|
+
function triggerMatchesEvent(trigger, event, text) {
|
|
35
|
+
const { keywords, keywordMode, scopeChannelIds } = trigger.match;
|
|
36
|
+
if (scopeChannelIds && scopeChannelIds.length > 0 && !scopeChannelIds.includes(event.channelId)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const cleaned = keywords.map((keyword) => keyword.trim()).filter(Boolean);
|
|
40
|
+
if (cleaned.length === 0)
|
|
41
|
+
return false;
|
|
42
|
+
const normalized = text.toLocaleLowerCase();
|
|
43
|
+
const hit = (keyword) => normalized.includes(keyword.toLocaleLowerCase());
|
|
44
|
+
return keywordMode === 'any' ? cleaned.some(hit) : cleaned.every(hit);
|
|
45
|
+
}
|
|
46
|
+
function buildSignal(trigger, event, text) {
|
|
47
|
+
return {
|
|
48
|
+
kind: trigger.kind,
|
|
49
|
+
memoryQuery: trigger.memoryQuery,
|
|
50
|
+
requiredEvidence: [...trigger.requiredEvidence],
|
|
51
|
+
confidence: trigger.match.minConfidence,
|
|
52
|
+
detector: `agent-authored:${trigger.id}`,
|
|
53
|
+
channelId: event.channelId,
|
|
54
|
+
occurredAt: event.createdAt,
|
|
55
|
+
reason: `Agent-authored trigger ${trigger.id} matched.`,
|
|
56
|
+
text,
|
|
57
|
+
sourceRefs: [{ sourceConnector: event.channel, sourceId: event.eventIndexId ?? String(event.id) }],
|
|
58
|
+
triggerId: trigger.id,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=trigger-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-matcher.js","sourceRoot":"","sources":["../../src/operator/trigger-matcher.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAMH,sCAeC;AAfD,SAAgB,aAAa,CAAC,KAA2B,EAAE,QAAyB;IAClF,2FAA2F;IAC3F,sCAAsC;IACtC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;QAC5C,IAAI,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAsB,EAAE,KAA2B,EAAE,IAAY;IAC5F,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IAEjE,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAChG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAClF,OAAO,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB,EAAE,KAA2B,EAAE,IAAY;IACpF,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,gBAAgB,EAAE,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAC/C,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;QACvC,QAAQ,EAAE,kBAAkB,OAAO,CAAC,EAAE,EAAE;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,MAAM,EAAE,0BAA0B,OAAO,CAAC,EAAE,WAAW;QACvD,IAAI;QACJ,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAClG,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TriggerRegistry - operator-owned persistence for agent-authored triggers.
|
|
3
|
+
*
|
|
4
|
+
* The agent authors triggers (trigger-author.ts); this store only persists/lists them.
|
|
5
|
+
* Ports Kagemusha `WorkflowContractRegistry`
|
|
6
|
+
* (~/project/mama-suite/apps/kagemusha/src/agent/contracts/workflow-registry.ts) but with the
|
|
7
|
+
* human-approval lifecycle removed: `create` yields `status:'active'` immediately (G4 unfrozen).
|
|
8
|
+
* There is no `needs_review`/`approvedBy` - that gate does not exist here by construction.
|
|
9
|
+
*
|
|
10
|
+
* Personal triggers live in the operator DB under `~/.mama`; this source is generic.
|
|
11
|
+
*/
|
|
12
|
+
import type { SQLiteDatabase } from '../sqlite.js';
|
|
13
|
+
import type { CreateTriggerInput, TriggerRecord } from './trigger-types.js';
|
|
14
|
+
export declare class TriggerRegistry {
|
|
15
|
+
private db;
|
|
16
|
+
constructor(db: SQLiteDatabase);
|
|
17
|
+
private runMigration;
|
|
18
|
+
/** Persist an agent-authored trigger. Self-activates (G4): status is 'active' at birth. */
|
|
19
|
+
create(input: CreateTriggerInput): TriggerRecord;
|
|
20
|
+
listActive(): TriggerRecord[];
|
|
21
|
+
/** Every trigger regardless of status (owner tray view). id DESC breaks same-ms ties. */
|
|
22
|
+
listAll(): TriggerRecord[];
|
|
23
|
+
getById(id: string): TriggerRecord | null;
|
|
24
|
+
/**
|
|
25
|
+
* Record that a trigger FIRED (read-only surface loop) - bumps `fired` only.
|
|
26
|
+
* Distinct from recordOutcome: a fire is not a success/failure judgment, and the
|
|
27
|
+
* read-only loop must never fabricate one (M1-T2).
|
|
28
|
+
*/
|
|
29
|
+
recordFire(id: string): void;
|
|
30
|
+
/** Record an intervention outcome - the G2 evolution feed (Task 4 reads stats). */
|
|
31
|
+
recordOutcome(id: string, outcome: 'succeeded' | 'failed'): void;
|
|
32
|
+
/** Retire a trigger (agent-judged in Task 4; here it's the mechanical write). */
|
|
33
|
+
disable(id: string, reason: string): TriggerRecord;
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=trigger-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-registry.d.ts","sourceRoot":"","sources":["../../src/operator/trigger-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAiB,MAAM,oBAAoB,CAAC;AAoB3F,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAiB;gBAEf,EAAE,EAAE,cAAc;IAK9B,OAAO,CAAC,YAAY;IAuBpB,2FAA2F;IAC3F,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa;IAgChD,UAAU,IAAI,aAAa,EAAE;IAO7B,yFAAyF;IACzF,OAAO,IAAI,aAAa,EAAE;IAO1B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAOzC;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO5B,mFAAmF;IACnF,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,IAAI;IAYhE,iFAAiF;IACjF,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa;IAYlD,KAAK,IAAI,IAAI;CAGd"}
|