@femtomc/mu-control-plane 26.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +29 -0
  2. package/dist/adapter_audit.d.ts +27 -0
  3. package/dist/adapter_audit.d.ts.map +1 -0
  4. package/dist/adapter_audit.js +57 -0
  5. package/dist/channel_adapters.d.ts +53 -0
  6. package/dist/channel_adapters.d.ts.map +1 -0
  7. package/dist/channel_adapters.js +734 -0
  8. package/dist/command_context.d.ts +31 -0
  9. package/dist/command_context.d.ts.map +1 -0
  10. package/dist/command_context.js +221 -0
  11. package/dist/command_journal.d.ts +308 -0
  12. package/dist/command_journal.d.ts.map +1 -0
  13. package/dist/command_journal.js +197 -0
  14. package/dist/command_parser.d.ts +31 -0
  15. package/dist/command_parser.d.ts.map +1 -0
  16. package/dist/command_parser.js +130 -0
  17. package/dist/command_pipeline.d.ts +100 -0
  18. package/dist/command_pipeline.d.ts.map +1 -0
  19. package/dist/command_pipeline.js +637 -0
  20. package/dist/command_record.d.ts +89 -0
  21. package/dist/command_record.d.ts.map +1 -0
  22. package/dist/command_record.js +138 -0
  23. package/dist/command_state.d.ts +29 -0
  24. package/dist/command_state.d.ts.map +1 -0
  25. package/dist/command_state.js +64 -0
  26. package/dist/confirmation_manager.d.ts +54 -0
  27. package/dist/confirmation_manager.d.ts.map +1 -0
  28. package/dist/confirmation_manager.js +99 -0
  29. package/dist/idempotency_ledger.d.ts +84 -0
  30. package/dist/idempotency_ledger.d.ts.map +1 -0
  31. package/dist/idempotency_ledger.js +174 -0
  32. package/dist/identity_store.d.ts +219 -0
  33. package/dist/identity_store.d.ts.map +1 -0
  34. package/dist/identity_store.js +323 -0
  35. package/dist/index.d.ts +22 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +21 -0
  38. package/dist/meta_agent.d.ts +127 -0
  39. package/dist/meta_agent.d.ts.map +1 -0
  40. package/dist/meta_agent.js +415 -0
  41. package/dist/models.d.ts +132 -0
  42. package/dist/models.d.ts.map +1 -0
  43. package/dist/models.js +62 -0
  44. package/dist/mu_cli_runner.d.ts +76 -0
  45. package/dist/mu_cli_runner.d.ts.map +1 -0
  46. package/dist/mu_cli_runner.js +364 -0
  47. package/dist/operator_tooling.d.ts +19 -0
  48. package/dist/operator_tooling.d.ts.map +1 -0
  49. package/dist/operator_tooling.js +126 -0
  50. package/dist/outbox.d.ts +253 -0
  51. package/dist/outbox.d.ts.map +1 -0
  52. package/dist/outbox.js +313 -0
  53. package/dist/paths.d.ts +13 -0
  54. package/dist/paths.d.ts.map +1 -0
  55. package/dist/paths.js +15 -0
  56. package/dist/policy.d.ts +182 -0
  57. package/dist/policy.d.ts.map +1 -0
  58. package/dist/policy.js +434 -0
  59. package/dist/runtime.d.ts +79 -0
  60. package/dist/runtime.d.ts.map +1 -0
  61. package/dist/runtime.js +260 -0
  62. package/dist/serialized_mutation_executor.d.ts +5 -0
  63. package/dist/serialized_mutation_executor.d.ts.map +1 -0
  64. package/dist/serialized_mutation_executor.js +8 -0
  65. package/dist/writer_lock.d.ts +28 -0
  66. package/dist/writer_lock.d.ts.map +1 -0
  67. package/dist/writer_lock.js +97 -0
  68. package/package.json +18 -0
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @femtomc/mu-control-plane
2
+
3
+ Control-plane command pipeline for messaging ingress, policy/confirmation safety, idempotency, outbox delivery, and the dedicated messaging meta-agent runtime.
4
+
5
+ ## First-platform messaging adapters (v1)
6
+
7
+ - Slack
8
+ - Discord
9
+ - Telegram
10
+
11
+ All three adapters normalize inbound commands into the same control-plane pipeline and preserve correlation across command journal and outbox delivery.
12
+
13
+ ## Messaging meta-agent + safe CLI triggers
14
+
15
+ `MessagingMetaAgentRuntime` is a dedicated user-facing runtime that sits outside orchestration execution dispatch. It can translate conversational channel input into an approved command proposal and routes that through the same policy/idempotency/confirmation pipeline.
16
+
17
+ CLI execution is constrained through an explicit allowlist (`MuCliCommandSurface`) and a non-shell runner (`MuCliRunner`). Mutating run triggers (`run start`, `run resume`) still require confirmation and are correlated end-to-end via:
18
+
19
+ - `meta_session_id`
20
+ - `meta_turn_id`
21
+ - `cli_invocation_id`
22
+ - `cli_command_kind`
23
+ - `run_root_id`
24
+
25
+ Unsafe or ambiguous requests are rejected with explicit reasons (`context_missing`, `context_ambiguous`, `context_unauthorized`, `cli_validation_failed`, etc.).
26
+
27
+ ## iMessage status
28
+
29
+ iMessage is explicitly de-scoped from first-platform runtime support in v1. Legacy iMessage identity rows are quarantined as `channel_deprecated` during replay and are not treated as active bindings.
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ export declare const AdapterAuditEntrySchema: z.ZodObject<{
3
+ kind: z.ZodLiteral<"adapter.audit">;
4
+ ts_ms: z.ZodNumber;
5
+ channel: z.ZodString;
6
+ request_id: z.ZodString;
7
+ delivery_id: z.ZodString;
8
+ channel_tenant_id: z.ZodString;
9
+ channel_conversation_id: z.ZodString;
10
+ actor_id: z.ZodString;
11
+ command_text: z.ZodString;
12
+ event: z.ZodString;
13
+ reason: z.ZodDefault<z.ZodNullable<z.ZodString>>;
14
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
15
+ }, z.core.$strip>;
16
+ export type AdapterAuditEntry = z.infer<typeof AdapterAuditEntrySchema>;
17
+ export declare class AdapterAuditLog {
18
+ #private;
19
+ constructor(path: string);
20
+ get path(): string;
21
+ append(entry: Omit<AdapterAuditEntry, "kind">): Promise<AdapterAuditEntry>;
22
+ list(opts?: {
23
+ channel?: string | null;
24
+ event?: string | null;
25
+ }): Promise<AdapterAuditEntry[]>;
26
+ }
27
+ //# sourceMappingURL=adapter_audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter_audit.d.ts","sourceRoot":"","sources":["../src/adapter_audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;iBAalC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,qBAAa,eAAe;;gBAGR,IAAI,EAAE,MAAM;IAI/B,IAAW,IAAI,IAAI,MAAM,CAExB;IAEY,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAS1E,IAAI,CAAC,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAwB9G"}
@@ -0,0 +1,57 @@
1
+ import { appendJsonl, readJsonl } from "@femtomc/mu-core/node";
2
+ import { z } from "zod";
3
+ export const AdapterAuditEntrySchema = z.object({
4
+ kind: z.literal("adapter.audit"),
5
+ ts_ms: z.number().int(),
6
+ channel: z.string().min(1),
7
+ request_id: z.string().min(1),
8
+ delivery_id: z.string().min(1),
9
+ channel_tenant_id: z.string().min(1),
10
+ channel_conversation_id: z.string().min(1),
11
+ actor_id: z.string().min(1),
12
+ command_text: z.string().min(1),
13
+ event: z.string().min(1),
14
+ reason: z.string().nullable().default(null),
15
+ metadata: z.record(z.string(), z.unknown()).default({}),
16
+ });
17
+ export class AdapterAuditLog {
18
+ #path;
19
+ constructor(path) {
20
+ this.#path = path;
21
+ }
22
+ get path() {
23
+ return this.#path;
24
+ }
25
+ async append(entry) {
26
+ const parsed = AdapterAuditEntrySchema.parse({
27
+ kind: "adapter.audit",
28
+ ...entry,
29
+ });
30
+ await appendJsonl(this.#path, parsed);
31
+ return parsed;
32
+ }
33
+ async list(opts = {}) {
34
+ const rows = await readJsonl(this.#path);
35
+ const out = [];
36
+ for (let idx = 0; idx < rows.length; idx++) {
37
+ const parsed = AdapterAuditEntrySchema.safeParse(rows[idx]);
38
+ if (!parsed.success) {
39
+ throw new Error(`invalid adapter audit row ${idx}: ${parsed.error.message}`);
40
+ }
41
+ if (opts.channel && parsed.data.channel !== opts.channel) {
42
+ continue;
43
+ }
44
+ if (opts.event && parsed.data.event !== opts.event) {
45
+ continue;
46
+ }
47
+ out.push(parsed.data);
48
+ }
49
+ out.sort((a, b) => {
50
+ if (a.ts_ms !== b.ts_ms) {
51
+ return a.ts_ms - b.ts_ms;
52
+ }
53
+ return a.request_id.localeCompare(b.request_id);
54
+ });
55
+ return out;
56
+ }
57
+ }
@@ -0,0 +1,53 @@
1
+ import type { AdapterAuditEntry } from "./adapter_audit.js";
2
+ import type { CommandPipelineResult, ControlPlaneCommandPipeline } from "./command_pipeline.js";
3
+ import { type Channel } from "./identity_store.js";
4
+ import { type InboundEnvelope } from "./models.js";
5
+ import type { ControlPlaneOutbox, OutboxRecord } from "./outbox.js";
6
+ export type AdapterIngressResult = {
7
+ channel: Channel;
8
+ accepted: boolean;
9
+ reason?: string;
10
+ response: Response;
11
+ inbound: InboundEnvelope | null;
12
+ pipelineResult: CommandPipelineResult | null;
13
+ outboxRecord: OutboxRecord | null;
14
+ auditEntry: AdapterAuditEntry | null;
15
+ };
16
+ export type SlackControlPlaneAdapterOpts = {
17
+ pipeline: ControlPlaneCommandPipeline;
18
+ outbox: ControlPlaneOutbox;
19
+ signingSecret: string;
20
+ nowMs?: () => number;
21
+ allowedTimestampSkewSec?: number;
22
+ };
23
+ export declare class SlackControlPlaneAdapter {
24
+ #private;
25
+ constructor(opts: SlackControlPlaneAdapterOpts);
26
+ ingest(req: Request): Promise<AdapterIngressResult>;
27
+ }
28
+ export type DiscordControlPlaneAdapterOpts = {
29
+ pipeline: ControlPlaneCommandPipeline;
30
+ outbox: ControlPlaneOutbox;
31
+ signingSecret: string;
32
+ nowMs?: () => number;
33
+ allowedTimestampSkewSec?: number;
34
+ };
35
+ export declare class DiscordControlPlaneAdapter {
36
+ #private;
37
+ constructor(opts: DiscordControlPlaneAdapterOpts);
38
+ ingest(req: Request): Promise<AdapterIngressResult>;
39
+ }
40
+ export type TelegramControlPlaneAdapterOpts = {
41
+ pipeline: ControlPlaneCommandPipeline;
42
+ outbox: ControlPlaneOutbox;
43
+ webhookSecret: string;
44
+ tenantId?: string;
45
+ botUsername?: string | null;
46
+ nowMs?: () => number;
47
+ };
48
+ export declare class TelegramControlPlaneAdapter {
49
+ #private;
50
+ constructor(opts: TelegramControlPlaneAdapterOpts);
51
+ ingest(req: Request): Promise<AdapterIngressResult>;
52
+ }
53
+ //# sourceMappingURL=channel_adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel_adapters.d.ts","sourceRoot":"","sources":["../src/channel_adapters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEhG,OAAO,EAA2B,KAAK,OAAO,EAAiB,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAsB,KAAK,eAAe,EAAgD,MAAM,aAAa,CAAC;AACrH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA4QpE,MAAM,MAAM,oBAAoB,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IAC1C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAgCF,qBAAa,wBAAwB;;gBAOjB,IAAI,EAAE,4BAA4B;IAQxC,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAyGhE;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC5C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAgCF,qBAAa,0BAA0B;;gBAOnB,IAAI,EAAE,8BAA8B;IAQ1C,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAuJhE;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC7C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,2BAA2B;;gBAQpB,IAAI,EAAE,+BAA+B;IAoB3C,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA+KhE"}