@company-semantics/contracts 9.1.0 → 9.2.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.
Files changed (141) hide show
  1. package/package.json +4 -1
  2. package/src/__tests__/resource-keys.test.ts +30 -23
  3. package/src/admin/authz-simulate.ts +4 -4
  4. package/src/admin/direct-grants.ts +2 -2
  5. package/src/api/generated-spec-hash.ts +2 -2
  6. package/src/api/generated.ts +97 -0
  7. package/src/api/http/routes/ai-chat.ts +3 -3
  8. package/src/api/http/utils/resource-response.ts +5 -2
  9. package/src/api/index.ts +4 -4
  10. package/src/api/primitives.ts +6 -2
  11. package/src/auth/README.md +1 -0
  12. package/src/auth/index.ts +12 -5
  13. package/src/autotune.ts +5 -1
  14. package/src/billing/index.ts +1 -1
  15. package/src/billing/types.ts +1 -1
  16. package/src/chat/README.md +3 -0
  17. package/src/chat/__tests__/runtime-profile.test.ts +68 -48
  18. package/src/chat/index.ts +10 -4
  19. package/src/chat/runtime-profile.ts +25 -10
  20. package/src/chat/schemas.ts +49 -41
  21. package/src/chat/types.ts +48 -42
  22. package/src/ci-envelope/README.md +2 -0
  23. package/src/ci-envelope/__tests__/transitions.test.ts +56 -56
  24. package/src/ci-envelope/index.ts +2 -2
  25. package/src/ci-envelope/types.ts +20 -20
  26. package/src/ci-results/index.ts +2 -2
  27. package/src/ci-results/repo-ci-result.ts +15 -12
  28. package/src/compatibility.ts +6 -6
  29. package/src/content/index.ts +10 -4
  30. package/src/content/schemas.ts +42 -24
  31. package/src/dispatch/index.ts +18 -15
  32. package/src/email/__tests__/registry.test.ts +81 -77
  33. package/src/email/index.ts +3 -3
  34. package/src/email/registry.ts +25 -25
  35. package/src/email/types.ts +43 -43
  36. package/src/errors/index.ts +8 -8
  37. package/src/execution/__tests__/events.test.ts +42 -42
  38. package/src/execution/__tests__/lifecycle.test.ts +192 -190
  39. package/src/execution/__tests__/registry.test.ts +114 -114
  40. package/src/execution/audit-export.ts +4 -4
  41. package/src/execution/errors.ts +7 -7
  42. package/src/execution/event-metadata.ts +4 -4
  43. package/src/execution/events.ts +23 -21
  44. package/src/execution/expiry.ts +5 -5
  45. package/src/execution/hash-chain.ts +2 -2
  46. package/src/execution/index.ts +19 -28
  47. package/src/execution/kinds.ts +7 -7
  48. package/src/execution/lifecycle.ts +33 -33
  49. package/src/execution/registry.ts +63 -63
  50. package/src/execution/schemas.ts +31 -23
  51. package/src/execution/status.ts +45 -26
  52. package/src/execution/summary.ts +16 -17
  53. package/src/execution/timeline-ui.ts +9 -9
  54. package/src/execution/types.ts +31 -25
  55. package/src/generated/openapi-routes.ts +1 -0
  56. package/src/guards/config.ts +22 -18
  57. package/src/guards/index.ts +4 -4
  58. package/src/guards/types.ts +32 -24
  59. package/src/identity/__tests__/avatar.test.ts +68 -59
  60. package/src/identity/avatar.ts +8 -8
  61. package/src/identity/display-name.ts +3 -3
  62. package/src/identity/index.ts +8 -8
  63. package/src/identity/people-org-chart.ts +8 -4
  64. package/src/identity/schemas.ts +28 -18
  65. package/src/identity/types.ts +5 -5
  66. package/src/impersonation/index.ts +5 -5
  67. package/src/impersonation/schemas.ts +15 -9
  68. package/src/impersonation-events.ts +21 -21
  69. package/src/impersonation.ts +25 -24
  70. package/src/index.ts +118 -90
  71. package/src/interfaces/mcp/tools/help.ts +19 -19
  72. package/src/internal-admin.ts +6 -6
  73. package/src/mcp/README.md +2 -0
  74. package/src/mcp/__tests__/capability-graph.test.ts +290 -290
  75. package/src/mcp/capability-graph.ts +42 -40
  76. package/src/mcp/failure-context.ts +1 -3
  77. package/src/mcp/index.ts +57 -57
  78. package/src/mcp/resources.ts +9 -9
  79. package/src/meetings/index.ts +2 -2
  80. package/src/meetings/schemas.ts +51 -34
  81. package/src/message-parts/README.md +2 -0
  82. package/src/message-parts/__tests__/builder.test.ts +142 -142
  83. package/src/message-parts/__tests__/confirmation.test.ts +100 -86
  84. package/src/message-parts/__tests__/preview.test.ts +63 -63
  85. package/src/message-parts/__tests__/wire.test.ts +130 -124
  86. package/src/message-parts/builder.ts +23 -23
  87. package/src/message-parts/confirmation.ts +17 -14
  88. package/src/message-parts/execution.ts +7 -7
  89. package/src/message-parts/index.ts +10 -10
  90. package/src/message-parts/lifecycle.ts +25 -25
  91. package/src/message-parts/preview.ts +30 -30
  92. package/src/message-parts/types.ts +27 -27
  93. package/src/message-parts/wire.ts +24 -24
  94. package/src/mutations.ts +2 -2
  95. package/src/observability.ts +23 -11
  96. package/src/org/__tests__/org-units.test.ts +131 -96
  97. package/src/org/__tests__/tree-ordering.test.ts +57 -37
  98. package/src/org/__tests__/view-scopes.test.ts +40 -40
  99. package/src/org/domain.ts +9 -9
  100. package/src/org/index.ts +24 -21
  101. package/src/org/org-units.ts +34 -20
  102. package/src/org/schemas.ts +201 -127
  103. package/src/org/sharing.ts +17 -13
  104. package/src/org/tree-ordering.ts +3 -1
  105. package/src/org/types.ts +54 -47
  106. package/src/org/view-scopes.ts +9 -9
  107. package/src/permissions/access-levels.ts +7 -2
  108. package/src/permissions/access-source.ts +6 -6
  109. package/src/permissions/index.ts +5 -5
  110. package/src/permissions/orgchart-roles.ts +7 -7
  111. package/src/permissions/permission-introspection.ts +7 -5
  112. package/src/permissions/share-api.ts +19 -9
  113. package/src/pressure.ts +4 -4
  114. package/src/queryIntent.ts +21 -21
  115. package/src/ralph/__tests__/prd-groups.test.ts +159 -159
  116. package/src/ralph/__tests__/prd.test.ts +30 -30
  117. package/src/ralph/index.ts +3 -8
  118. package/src/ralph/prd.ts +33 -33
  119. package/src/ralph/progress.ts +1 -1
  120. package/src/rate-limit/README.md +4 -4
  121. package/src/rate-limit/index.ts +3 -3
  122. package/src/requests.ts +36 -8
  123. package/src/resource-keys.ts +207 -124
  124. package/src/resource-registry.ts +5 -5
  125. package/src/route-builder.ts +3 -3
  126. package/src/safe-mode.ts +2 -2
  127. package/src/security/index.ts +4 -4
  128. package/src/security/org-secrets.ts +13 -9
  129. package/src/security/secret.ts +3 -3
  130. package/src/sse.ts +3 -1
  131. package/src/system/README.md +3 -0
  132. package/src/system/capabilities.ts +22 -23
  133. package/src/system/diagram.ts +45 -45
  134. package/src/system/index.ts +14 -14
  135. package/src/tiers.ts +1 -1
  136. package/src/timeouts.ts +1 -1
  137. package/src/tracing.ts +30 -30
  138. package/src/types/analytics.ts +2 -2
  139. package/src/usage/README.md +3 -0
  140. package/src/usage/execution-types.ts +69 -69
  141. package/src/usage/types.ts +7 -3
@@ -1,110 +1,124 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { WireSurfaceBuilder } from '../wire.js'
3
- import type { ConfirmationData, ConfirmationRiskLevel } from '../confirmation.js'
4
- import { CONFIRMATION_LABELS, getConfirmationLabel } from '../confirmation.js'
5
- import type { ExecutionKind } from '../../execution/kinds.js'
6
- import { EXECUTION_KINDS } from '../../execution/registry.js'
7
-
8
- describe('WireSurfaceBuilder.confirmation', () => {
9
- it('creates a confirmation data part with new shape', () => {
1
+ import { describe, it, expect } from "vitest";
2
+ import { WireSurfaceBuilder } from "../wire.js";
3
+ import type {
4
+ ConfirmationData,
5
+ ConfirmationRiskLevel,
6
+ } from "../confirmation.js";
7
+ import { CONFIRMATION_LABELS, getConfirmationLabel } from "../confirmation.js";
8
+ import type { ExecutionKind } from "../../execution/kinds.js";
9
+ import { EXECUTION_KINDS } from "../../execution/registry.js";
10
+
11
+ describe("WireSurfaceBuilder.confirmation", () => {
12
+ it("creates a confirmation data part with new shape", () => {
10
13
  const data: ConfirmationData = {
11
- actionId: 'msg-123',
12
- executorKind: 'slack.send',
13
- risk: 'low',
14
- executionId: 'exec-abc-001',
15
- }
14
+ actionId: "msg-123",
15
+ executorKind: "slack.send",
16
+ risk: "low",
17
+ executionId: "exec-abc-001",
18
+ };
16
19
 
17
- const result = WireSurfaceBuilder.confirmation(data)
20
+ const result = WireSurfaceBuilder.confirmation(data);
18
21
 
19
- expect(result.type).toBe('data-confirmation')
20
- expect(result.data).toEqual(data)
21
- })
22
+ expect(result.type).toBe("data-confirmation");
23
+ expect(result.data).toEqual(data);
24
+ });
22
25
 
23
- it('preserves actionId exactly', () => {
26
+ it("preserves actionId exactly", () => {
24
27
  const data: ConfirmationData = {
25
- actionId: 'complex-action-id-12345',
26
- executorKind: 'integration.connect',
27
- risk: 'moderate',
28
- executionId: 'exec-xyz-789',
29
- }
28
+ actionId: "complex-action-id-12345",
29
+ executorKind: "integration.connect",
30
+ risk: "moderate",
31
+ executionId: "exec-xyz-789",
32
+ };
30
33
 
31
- const result = WireSurfaceBuilder.confirmation(data)
34
+ const result = WireSurfaceBuilder.confirmation(data);
32
35
 
33
- expect(result.data.actionId).toBe('complex-action-id-12345')
34
- })
36
+ expect(result.data.actionId).toBe("complex-action-id-12345");
37
+ });
35
38
 
36
- it('preserves all ConfirmationRiskLevel values', () => {
37
- const risks: ConfirmationRiskLevel[] = ['low', 'moderate', 'high', 'irreversible']
39
+ it("preserves all ConfirmationRiskLevel values", () => {
40
+ const risks: ConfirmationRiskLevel[] = [
41
+ "low",
42
+ "moderate",
43
+ "high",
44
+ "irreversible",
45
+ ];
38
46
 
39
47
  for (const risk of risks) {
40
48
  const data: ConfirmationData = {
41
49
  actionId: `risk-${risk}`,
42
- executorKind: 'profile.update',
50
+ executorKind: "profile.update",
43
51
  risk,
44
52
  executionId: `exec-risk-${risk}`,
45
- }
53
+ };
46
54
 
47
- const result = WireSurfaceBuilder.confirmation(data)
55
+ const result = WireSurfaceBuilder.confirmation(data);
48
56
 
49
- expect(result.data.risk).toBe(risk)
57
+ expect(result.data.risk).toBe(risk);
50
58
  }
51
- })
59
+ });
52
60
 
53
- it('preserves executionId and executorKind', () => {
61
+ it("preserves executionId and executorKind", () => {
54
62
  const data: ConfirmationData = {
55
- actionId: 'action-001',
56
- executorKind: 'integration.disconnect',
57
- risk: 'high',
58
- executionId: 'exec-lifecycle-001',
59
- }
60
-
61
- const result = WireSurfaceBuilder.confirmation(data)
62
-
63
- expect(result.data.executionId).toBe('exec-lifecycle-001')
64
- expect(result.data.executorKind).toBe('integration.disconnect')
65
- })
66
- })
67
-
68
- describe('getConfirmationLabel', () => {
69
- it('returns correct label for known ExecutionKind', () => {
70
- expect(getConfirmationLabel('integration.connect')).toBe('Connect Integration')
71
- expect(getConfirmationLabel('integration.disconnect')).toBe('Disconnect Integration')
72
- expect(getConfirmationLabel('profile.update')).toBe('Update Profile')
73
- expect(getConfirmationLabel('slack.send')).toBe('Send Slack Message')
74
- expect(getConfirmationLabel('data.ingest')).toBe('Import Channel')
75
- expect(getConfirmationLabel('data.scope')).toBe('Update Scope')
76
- expect(getConfirmationLabel('system.cleanup')).toBe('Cleanup Connections')
77
- })
78
-
79
- it('returns default fallback for undefined', () => {
80
- expect(getConfirmationLabel(undefined)).toBe('Confirm Action')
81
- })
82
-
83
- it('returns custom fallback title when provided', () => {
84
- expect(getConfirmationLabel(undefined, 'Custom Fallback')).toBe('Custom Fallback')
85
- })
86
- })
87
-
88
- describe('CONFIRMATION_LABELS', () => {
89
- it('has an entry for every ExecutionKind', () => {
90
- const executionKinds = Object.keys(EXECUTION_KINDS) as ExecutionKind[]
63
+ actionId: "action-001",
64
+ executorKind: "integration.disconnect",
65
+ risk: "high",
66
+ executionId: "exec-lifecycle-001",
67
+ };
68
+
69
+ const result = WireSurfaceBuilder.confirmation(data);
70
+
71
+ expect(result.data.executionId).toBe("exec-lifecycle-001");
72
+ expect(result.data.executorKind).toBe("integration.disconnect");
73
+ });
74
+ });
75
+
76
+ describe("getConfirmationLabel", () => {
77
+ it("returns correct label for known ExecutionKind", () => {
78
+ expect(getConfirmationLabel("integration.connect")).toBe(
79
+ "Connect Integration",
80
+ );
81
+ expect(getConfirmationLabel("integration.disconnect")).toBe(
82
+ "Disconnect Integration",
83
+ );
84
+ expect(getConfirmationLabel("profile.update")).toBe("Update Profile");
85
+ expect(getConfirmationLabel("slack.send")).toBe("Send Slack Message");
86
+ expect(getConfirmationLabel("data.ingest")).toBe("Import Channel");
87
+ expect(getConfirmationLabel("data.scope")).toBe("Update Scope");
88
+ expect(getConfirmationLabel("system.cleanup")).toBe("Cleanup Connections");
89
+ });
90
+
91
+ it("returns default fallback for undefined", () => {
92
+ expect(getConfirmationLabel(undefined)).toBe("Confirm Action");
93
+ });
94
+
95
+ it("returns custom fallback title when provided", () => {
96
+ expect(getConfirmationLabel(undefined, "Custom Fallback")).toBe(
97
+ "Custom Fallback",
98
+ );
99
+ });
100
+ });
101
+
102
+ describe("CONFIRMATION_LABELS", () => {
103
+ it("has an entry for every ExecutionKind", () => {
104
+ const executionKinds = Object.keys(EXECUTION_KINDS) as ExecutionKind[];
91
105
 
92
106
  for (const kind of executionKinds) {
93
- expect(CONFIRMATION_LABELS[kind]).toBeDefined()
94
- expect(typeof CONFIRMATION_LABELS[kind]).toBe('string')
95
- expect(CONFIRMATION_LABELS[kind].length).toBeGreaterThan(0)
107
+ expect(CONFIRMATION_LABELS[kind]).toBeDefined();
108
+ expect(typeof CONFIRMATION_LABELS[kind]).toBe("string");
109
+ expect(CONFIRMATION_LABELS[kind].length).toBeGreaterThan(0);
96
110
  }
97
- })
111
+ });
98
112
 
99
- it('values are exact and stable (golden snapshot)', () => {
113
+ it("values are exact and stable (golden snapshot)", () => {
100
114
  expect(CONFIRMATION_LABELS).toStrictEqual({
101
- 'integration.connect': 'Connect Integration',
102
- 'integration.disconnect': 'Disconnect Integration',
103
- 'profile.update': 'Update Profile',
104
- 'slack.send': 'Send Slack Message',
105
- 'data.ingest': 'Import Channel',
106
- 'data.scope': 'Update Scope',
107
- 'system.cleanup': 'Cleanup Connections',
108
- })
109
- })
110
- })
115
+ "integration.connect": "Connect Integration",
116
+ "integration.disconnect": "Disconnect Integration",
117
+ "profile.update": "Update Profile",
118
+ "slack.send": "Send Slack Message",
119
+ "data.ingest": "Import Channel",
120
+ "data.scope": "Update Scope",
121
+ "system.cleanup": "Cleanup Connections",
122
+ });
123
+ });
124
+ });
@@ -1,97 +1,97 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { WireSurfaceBuilder } from '../wire.js'
3
- import type { PreviewData, PreviewArtifact } from '../preview.js'
1
+ import { describe, it, expect } from "vitest";
2
+ import { WireSurfaceBuilder } from "../wire.js";
3
+ import type { PreviewData, PreviewArtifact } from "../preview.js";
4
4
 
5
- describe('WireSurfaceBuilder.preview', () => {
6
- it('creates a preview data part', () => {
5
+ describe("WireSurfaceBuilder.preview", () => {
6
+ it("creates a preview data part", () => {
7
7
  const data: PreviewData = {
8
- actionId: 'msg-123',
9
- title: 'Send Slack message to #sales',
10
- description: 'This will notify the sales team about the new pricing.',
8
+ actionId: "msg-123",
9
+ title: "Send Slack message to #sales",
10
+ description: "This will notify the sales team about the new pricing.",
11
11
  artifacts: [
12
12
  {
13
- kind: 'message',
14
- label: '#sales',
13
+ kind: "message",
14
+ label: "#sales",
15
15
  content: {
16
- channel: 'C123456',
17
- text: 'New pricing is live!',
16
+ channel: "C123456",
17
+ text: "New pricing is live!",
18
18
  },
19
19
  },
20
20
  ],
21
- }
21
+ };
22
22
 
23
- const result = WireSurfaceBuilder.preview(data)
23
+ const result = WireSurfaceBuilder.preview(data);
24
24
 
25
- expect(result.type).toBe('data-preview')
26
- expect(result.data).toEqual(data)
27
- })
25
+ expect(result.type).toBe("data-preview");
26
+ expect(result.data).toEqual(data);
27
+ });
28
28
 
29
- it('preserves artifact structure exactly', () => {
29
+ it("preserves artifact structure exactly", () => {
30
30
  const artifacts: PreviewArtifact[] = [
31
31
  {
32
- kind: 'api_call',
33
- label: 'POST /api/notify',
34
- content: { method: 'POST', body: { message: 'test' } },
35
- metadata: { target: 'internal-api', impact: 'low' },
32
+ kind: "api_call",
33
+ label: "POST /api/notify",
34
+ content: { method: "POST", body: { message: "test" } },
35
+ metadata: { target: "internal-api", impact: "low" },
36
36
  },
37
37
  {
38
- kind: 'notification',
39
- label: 'Email to team@example.com',
40
- content: { to: 'team@example.com', subject: 'Update' },
38
+ kind: "notification",
39
+ label: "Email to team@example.com",
40
+ content: { to: "team@example.com", subject: "Update" },
41
41
  },
42
- ]
42
+ ];
43
43
 
44
44
  const data: PreviewData = {
45
- actionId: 'multi-123',
46
- title: 'Multi-step action',
45
+ actionId: "multi-123",
46
+ title: "Multi-step action",
47
47
  artifacts,
48
- }
48
+ };
49
49
 
50
- const result = WireSurfaceBuilder.preview(data)
50
+ const result = WireSurfaceBuilder.preview(data);
51
51
 
52
- expect(result.data.artifacts).toEqual(artifacts)
53
- expect(result.data.artifacts[0].metadata?.impact).toBe('low')
54
- })
52
+ expect(result.data.artifacts).toEqual(artifacts);
53
+ expect(result.data.artifacts[0].metadata?.impact).toBe("low");
54
+ });
55
55
 
56
- it('handles empty artifacts array', () => {
56
+ it("handles empty artifacts array", () => {
57
57
  const data: PreviewData = {
58
- actionId: 'empty-preview',
59
- title: 'No actions preview',
58
+ actionId: "empty-preview",
59
+ title: "No actions preview",
60
60
  artifacts: [],
61
- }
61
+ };
62
62
 
63
- const result = WireSurfaceBuilder.preview(data)
63
+ const result = WireSurfaceBuilder.preview(data);
64
64
 
65
- expect(result.type).toBe('data-preview')
66
- expect(result.data.artifacts).toEqual([])
67
- })
65
+ expect(result.type).toBe("data-preview");
66
+ expect(result.data.artifacts).toEqual([]);
67
+ });
68
68
 
69
- it('preserves all artifact kinds', () => {
69
+ it("preserves all artifact kinds", () => {
70
70
  const allKinds: PreviewArtifact[] = [
71
- { kind: 'message', label: 'Slack message', content: {} },
72
- { kind: 'api_call', label: 'API call', content: {} },
73
- { kind: 'diff', label: 'File change', content: {} },
74
- { kind: 'notification', label: 'Notification', content: {} },
75
- { kind: 'task', label: 'Task creation', content: {} },
76
- { kind: 'calendar', label: 'Calendar event', content: {} },
77
- ]
71
+ { kind: "message", label: "Slack message", content: {} },
72
+ { kind: "api_call", label: "API call", content: {} },
73
+ { kind: "diff", label: "File change", content: {} },
74
+ { kind: "notification", label: "Notification", content: {} },
75
+ { kind: "task", label: "Task creation", content: {} },
76
+ { kind: "calendar", label: "Calendar event", content: {} },
77
+ ];
78
78
 
79
79
  const data: PreviewData = {
80
- actionId: 'all-kinds',
81
- title: 'All artifact kinds',
80
+ actionId: "all-kinds",
81
+ title: "All artifact kinds",
82
82
  artifacts: allKinds,
83
- }
83
+ };
84
84
 
85
- const result = WireSurfaceBuilder.preview(data)
85
+ const result = WireSurfaceBuilder.preview(data);
86
86
 
87
- expect(result.data.artifacts).toHaveLength(6)
87
+ expect(result.data.artifacts).toHaveLength(6);
88
88
  expect(result.data.artifacts.map((a) => a.kind)).toEqual([
89
- 'message',
90
- 'api_call',
91
- 'diff',
92
- 'notification',
93
- 'task',
94
- 'calendar',
95
- ])
96
- })
97
- })
89
+ "message",
90
+ "api_call",
91
+ "diff",
92
+ "notification",
93
+ "task",
94
+ "calendar",
95
+ ]);
96
+ });
97
+ });
@@ -1,127 +1,133 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { WireSurfaceBuilder } from '../wire.js'
3
- import type { ExecutionResultData } from '../execution.js'
4
- import type { UndoResultData } from '../execution.js'
5
-
6
- describe('WireSurfaceBuilder.toolList', () => {
7
- it('returns data part with type data-tool-list', () => {
8
- const tools = [{ name: 'search', description: 'Search tool', inputSchema: {} }] as any
9
- const result = WireSurfaceBuilder.toolList(tools)
10
- expect(result.type).toBe('data-tool-list')
11
- })
12
-
13
- it('data.tools matches input array exactly', () => {
1
+ import { describe, it, expect } from "vitest";
2
+ import { WireSurfaceBuilder } from "../wire.js";
3
+ import type { ExecutionResultData } from "../execution.js";
4
+ import type { UndoResultData } from "../execution.js";
5
+
6
+ describe("WireSurfaceBuilder.toolList", () => {
7
+ it("returns data part with type data-tool-list", () => {
8
+ const tools = [
9
+ { name: "search", description: "Search tool", inputSchema: {} },
10
+ ] as any;
11
+ const result = WireSurfaceBuilder.toolList(tools);
12
+ expect(result.type).toBe("data-tool-list");
13
+ });
14
+
15
+ it("data.tools matches input array exactly", () => {
14
16
  const tools = [
15
- { name: 'search', description: 'Search tool', inputSchema: {} },
16
- { name: 'fetch', description: 'Fetch tool', inputSchema: { type: 'object' } },
17
- ] as any
18
- const result = WireSurfaceBuilder.toolList(tools)
19
- expect(result.data.tools).toEqual(tools)
20
- })
21
-
22
- it('works with empty tools array', () => {
23
- const result = WireSurfaceBuilder.toolList([])
24
- expect(result.type).toBe('data-tool-list')
25
- expect(result.data.tools).toEqual([])
26
- })
27
- })
28
-
29
- describe('WireSurfaceBuilder.executionResult', () => {
17
+ { name: "search", description: "Search tool", inputSchema: {} },
18
+ {
19
+ name: "fetch",
20
+ description: "Fetch tool",
21
+ inputSchema: { type: "object" },
22
+ },
23
+ ] as any;
24
+ const result = WireSurfaceBuilder.toolList(tools);
25
+ expect(result.data.tools).toEqual(tools);
26
+ });
27
+
28
+ it("works with empty tools array", () => {
29
+ const result = WireSurfaceBuilder.toolList([]);
30
+ expect(result.type).toBe("data-tool-list");
31
+ expect(result.data.tools).toEqual([]);
32
+ });
33
+ });
34
+
35
+ describe("WireSurfaceBuilder.executionResult", () => {
30
36
  const data: ExecutionResultData = {
31
- actionId: 'act-1',
32
- executionId: 'exec-001',
33
- state: 'completed',
34
- artifacts: [{ kind: 'profile_name', label: 'Name', status: 'success' }],
35
- summary: { title: 'Profile Updated' },
36
- }
37
-
38
- it('returns data part with type data-execution-result', () => {
39
- const result = WireSurfaceBuilder.executionResult(data)
40
- expect(result.type).toBe('data-execution-result')
41
- })
42
-
43
- it('data matches input ExecutionResultData exactly', () => {
44
- const result = WireSurfaceBuilder.executionResult(data)
45
- expect(result.data).toEqual(data)
46
- })
47
-
48
- it('preserves actionId from input', () => {
49
- const result = WireSurfaceBuilder.executionResult(data)
50
- expect(result.data.actionId).toBe('act-1')
51
- })
52
- })
53
-
54
- describe('WireSurfaceBuilder.undoResult', () => {
37
+ actionId: "act-1",
38
+ executionId: "exec-001",
39
+ state: "completed",
40
+ artifacts: [{ kind: "profile_name", label: "Name", status: "success" }],
41
+ summary: { title: "Profile Updated" },
42
+ };
43
+
44
+ it("returns data part with type data-execution-result", () => {
45
+ const result = WireSurfaceBuilder.executionResult(data);
46
+ expect(result.type).toBe("data-execution-result");
47
+ });
48
+
49
+ it("data matches input ExecutionResultData exactly", () => {
50
+ const result = WireSurfaceBuilder.executionResult(data);
51
+ expect(result.data).toEqual(data);
52
+ });
53
+
54
+ it("preserves actionId from input", () => {
55
+ const result = WireSurfaceBuilder.executionResult(data);
56
+ expect(result.data.actionId).toBe("act-1");
57
+ });
58
+ });
59
+
60
+ describe("WireSurfaceBuilder.undoResult", () => {
55
61
  const data: UndoResultData = {
56
- actionId: 'act-1',
57
- executionId: 'exec-001',
58
- undoExecutionId: 'undo-exec-002',
59
- status: 'success',
60
- }
61
-
62
- it('returns data part with type data-undo-result', () => {
63
- const result = WireSurfaceBuilder.undoResult(data)
64
- expect(result.type).toBe('data-undo-result')
65
- })
66
-
67
- it('data matches input UndoResultData exactly', () => {
68
- const result = WireSurfaceBuilder.undoResult(data)
69
- expect(result.data).toEqual(data)
70
- })
71
-
72
- it('preserves undoExecutionId from input', () => {
73
- const result = WireSurfaceBuilder.undoResult(data)
74
- expect(result.data.undoExecutionId).toBe('undo-exec-002')
75
- })
76
- })
77
-
78
- describe('WireSurfaceBuilder.messageStart', () => {
79
- it('returns data part with type data-message-start', () => {
80
- const result = WireSurfaceBuilder.messageStart('msg-123')
81
- expect(result.type).toBe('data-message-start')
82
- })
83
-
84
- it('data.messageId matches input', () => {
85
- const result = WireSurfaceBuilder.messageStart('msg-456')
86
- expect(result.data.messageId).toBe('msg-456')
87
- })
88
-
89
- it('data.version is 1', () => {
90
- const result = WireSurfaceBuilder.messageStart('msg-789')
91
- expect(result.data.version).toBe(1)
92
- })
93
-
94
- it('data.timestamp is a valid ISO 8601 string', () => {
95
- const result = WireSurfaceBuilder.messageStart('msg-ts')
96
- const parsed = new Date(result.data.timestamp)
97
- expect(parsed.toISOString()).toBe(result.data.timestamp)
98
- })
99
- })
100
-
101
- describe('WireSurfaceBuilder.messageComplete', () => {
102
- it('returns data part with type data-message-complete', () => {
103
- const result = WireSurfaceBuilder.messageComplete('msg-123', 500)
104
- expect(result.type).toBe('data-message-complete')
105
- })
106
-
107
- it('data.messageId matches input', () => {
108
- const result = WireSurfaceBuilder.messageComplete('msg-456', 200)
109
- expect(result.data.messageId).toBe('msg-456')
110
- })
111
-
112
- it('data.narrativeLength matches input', () => {
113
- const result = WireSurfaceBuilder.messageComplete('msg-789', 1234)
114
- expect(result.data.narrativeLength).toBe(1234)
115
- })
116
-
117
- it('data.version is 1', () => {
118
- const result = WireSurfaceBuilder.messageComplete('msg-v', 100)
119
- expect(result.data.version).toBe(1)
120
- })
121
-
122
- it('data.timestamp is a valid ISO 8601 string', () => {
123
- const result = WireSurfaceBuilder.messageComplete('msg-ts', 300)
124
- const parsed = new Date(result.data.timestamp)
125
- expect(parsed.toISOString()).toBe(result.data.timestamp)
126
- })
127
- })
62
+ actionId: "act-1",
63
+ executionId: "exec-001",
64
+ undoExecutionId: "undo-exec-002",
65
+ status: "success",
66
+ };
67
+
68
+ it("returns data part with type data-undo-result", () => {
69
+ const result = WireSurfaceBuilder.undoResult(data);
70
+ expect(result.type).toBe("data-undo-result");
71
+ });
72
+
73
+ it("data matches input UndoResultData exactly", () => {
74
+ const result = WireSurfaceBuilder.undoResult(data);
75
+ expect(result.data).toEqual(data);
76
+ });
77
+
78
+ it("preserves undoExecutionId from input", () => {
79
+ const result = WireSurfaceBuilder.undoResult(data);
80
+ expect(result.data.undoExecutionId).toBe("undo-exec-002");
81
+ });
82
+ });
83
+
84
+ describe("WireSurfaceBuilder.messageStart", () => {
85
+ it("returns data part with type data-message-start", () => {
86
+ const result = WireSurfaceBuilder.messageStart("msg-123");
87
+ expect(result.type).toBe("data-message-start");
88
+ });
89
+
90
+ it("data.messageId matches input", () => {
91
+ const result = WireSurfaceBuilder.messageStart("msg-456");
92
+ expect(result.data.messageId).toBe("msg-456");
93
+ });
94
+
95
+ it("data.version is 1", () => {
96
+ const result = WireSurfaceBuilder.messageStart("msg-789");
97
+ expect(result.data.version).toBe(1);
98
+ });
99
+
100
+ it("data.timestamp is a valid ISO 8601 string", () => {
101
+ const result = WireSurfaceBuilder.messageStart("msg-ts");
102
+ const parsed = new Date(result.data.timestamp);
103
+ expect(parsed.toISOString()).toBe(result.data.timestamp);
104
+ });
105
+ });
106
+
107
+ describe("WireSurfaceBuilder.messageComplete", () => {
108
+ it("returns data part with type data-message-complete", () => {
109
+ const result = WireSurfaceBuilder.messageComplete("msg-123", 500);
110
+ expect(result.type).toBe("data-message-complete");
111
+ });
112
+
113
+ it("data.messageId matches input", () => {
114
+ const result = WireSurfaceBuilder.messageComplete("msg-456", 200);
115
+ expect(result.data.messageId).toBe("msg-456");
116
+ });
117
+
118
+ it("data.narrativeLength matches input", () => {
119
+ const result = WireSurfaceBuilder.messageComplete("msg-789", 1234);
120
+ expect(result.data.narrativeLength).toBe(1234);
121
+ });
122
+
123
+ it("data.version is 1", () => {
124
+ const result = WireSurfaceBuilder.messageComplete("msg-v", 100);
125
+ expect(result.data.version).toBe(1);
126
+ });
127
+
128
+ it("data.timestamp is a valid ISO 8601 string", () => {
129
+ const result = WireSurfaceBuilder.messageComplete("msg-ts", 300);
130
+ const parsed = new Date(result.data.timestamp);
131
+ expect(parsed.toISOString()).toBe(result.data.timestamp);
132
+ });
133
+ });