@productbrain/cli 0.1.0-beta.8928 → 0.1.0-beta.8933

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.
@@ -1,61 +0,0 @@
1
- /**
2
- * Activation ceremony — contextual retrieval after first capture.
3
- * WP-301 S4: Proves the system uses what the user captured by showing
4
- * related entries immediately after their first capture in a session.
5
- *
6
- * CRITICAL: This module must NEVER block or fail a capture. All errors
7
- * are caught and result in a null return (graceful degradation).
8
- */
9
- import { readSession } from './session.js';
10
- import { kernelCall } from './client.js';
11
- /**
12
- * Check if this is the user's first capture in the session and retrieve
13
- * contextual relations to prove the system connects their knowledge.
14
- *
15
- * Returns null if:
16
- * - Not the first capture
17
- * - Retrieval fails (graceful degradation)
18
- * - Session is not active
19
- */
20
- export async function checkActivation(entryId) {
21
- try {
22
- const session = readSession();
23
- if (!session)
24
- return null;
25
- // First capture = exactly 1 entry in the session (the one just added)
26
- if (session.entriesCaptured.length !== 1)
27
- return null;
28
- if (session.entriesCaptured[0] !== entryId)
29
- return null;
30
- // Retrieve related entries via orient (brief mode)
31
- let relatedEntries = [];
32
- try {
33
- const orient = await kernelCall('chain.getOrientView', { tier: 'standard' });
34
- // `orient` is already typed via the real server route (retired the stale local
35
- // OrientEntry/OrientResponse mirrors, which didn't have `.status` — a required field
36
- // on the real `activeWorkPackages` element type, `OrientActiveBet` — PR #398, Lane C
37
- // S3c annotation pass).
38
- if (orient?.activeWorkPackages && Array.isArray(orient.activeWorkPackages)) {
39
- relatedEntries = orient.activeWorkPackages
40
- .filter((e) => typeof e.entryId === 'string' &&
41
- typeof e.name === 'string' &&
42
- e.entryId !== entryId)
43
- .slice(0, 3)
44
- .map(e => ({
45
- entryId: e.entryId,
46
- name: e.name,
47
- relation: e.collectionSlug ?? 'related',
48
- }));
49
- }
50
- }
51
- catch {
52
- // Orient failed — still return activation with empty relations
53
- }
54
- return { isFirst: true, relatedEntries };
55
- }
56
- catch {
57
- // Activation must never block capture
58
- return null;
59
- }
60
- }
61
- //# sourceMappingURL=activation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activation.js","sourceRoot":"","sources":["../../src/lib/activation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAazC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,sEAAsE;QACtE,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtD,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QAExD,mDAAmD;QACnD,IAAI,cAAc,GAA6B,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAkD,qBAAqB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC9H,+EAA+E;YAC/E,qFAAqF;YACrF,qFAAqF;YACrF,wBAAwB;YACxB,IAAI,MAAM,EAAE,kBAAkB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC3E,cAAc,GAAG,MAAM,CAAC,kBAAkB;qBACvC,MAAM,CAAC,CAAC,CAAC,EAAuF,EAAE,CACjG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;oBAC7B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;oBAC1B,CAAC,CAAC,OAAO,KAAK,OAAO,CACtB;qBACA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;qBACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACT,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,cAAc,IAAI,SAAS;iBACxC,CAAC,CAAC,CAAC;YACR,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Tests for activation ceremony — WP-301 S4.
3
- * Verifies first-capture detection and graceful degradation.
4
- */
5
- export {};
6
- //# sourceMappingURL=activation.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activation.test.d.ts","sourceRoot":"","sources":["../../src/lib/activation.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,121 +0,0 @@
1
- /**
2
- * Tests for activation ceremony — WP-301 S4.
3
- * Verifies first-capture detection and graceful degradation.
4
- */
5
- import { describe, it, expect, vi, beforeEach } from 'vitest';
6
- // Mock session and client modules before importing activation
7
- vi.mock('./session.js', () => ({
8
- readSession: vi.fn(),
9
- }));
10
- vi.mock('./client.js', () => ({
11
- kernelCall: vi.fn(),
12
- }));
13
- import { checkActivation } from './activation.js';
14
- import { readSession } from './session.js';
15
- import { kernelCall } from './client.js';
16
- const mockReadSession = vi.mocked(readSession);
17
- const mockMcpCall = vi.mocked(kernelCall);
18
- beforeEach(() => {
19
- vi.resetAllMocks();
20
- });
21
- describe('checkActivation', () => {
22
- const baseSession = {
23
- sessionId: 'sess-1',
24
- workspaceId: 'ws-1',
25
- workspaceName: 'Test',
26
- startedAt: '2026-04-09T00:00:00Z',
27
- };
28
- it('returns ActivationResult when session has exactly 1 entry (first capture)', async () => {
29
- mockReadSession.mockReturnValue({
30
- ...baseSession,
31
- entriesCaptured: ['TEN-42'],
32
- });
33
- mockMcpCall.mockResolvedValue({
34
- activeWorkPackages: [
35
- { entryId: 'BET-5', name: 'Some bet', collectionSlug: 'work-packages' },
36
- { entryId: 'STD-10', name: 'A standard', collectionSlug: 'standards' },
37
- { entryId: 'TEN-42', name: 'The captured tension', collectionSlug: 'tensions' },
38
- ],
39
- });
40
- const result = await checkActivation('TEN-42');
41
- expect(result).not.toBeNull();
42
- expect(result.isFirst).toBe(true);
43
- // Should exclude the just-captured entry and include up to 3 others
44
- expect(result.relatedEntries).toHaveLength(2);
45
- expect(result.relatedEntries[0]).toEqual({
46
- entryId: 'BET-5',
47
- name: 'Some bet',
48
- relation: 'work-packages',
49
- });
50
- expect(result.relatedEntries[1]).toEqual({
51
- entryId: 'STD-10',
52
- name: 'A standard',
53
- relation: 'standards',
54
- });
55
- });
56
- it('returns null when session has more than 1 entry', async () => {
57
- mockReadSession.mockReturnValue({
58
- ...baseSession,
59
- entriesCaptured: ['TEN-42', 'DEC-7'],
60
- });
61
- const result = await checkActivation('DEC-7');
62
- expect(result).toBeNull();
63
- // Should not even call orient
64
- expect(mockMcpCall).not.toHaveBeenCalled();
65
- });
66
- it('returns null when no session is active', async () => {
67
- mockReadSession.mockReturnValue(null);
68
- const result = await checkActivation('TEN-42');
69
- expect(result).toBeNull();
70
- });
71
- it('returns null when orient call fails (graceful degradation)', async () => {
72
- mockReadSession.mockReturnValue({
73
- ...baseSession,
74
- entriesCaptured: ['TEN-42'],
75
- });
76
- mockMcpCall.mockRejectedValue(new Error('Network error'));
77
- const result = await checkActivation('TEN-42');
78
- // Should still return activation result with empty relations, not null
79
- expect(result).not.toBeNull();
80
- expect(result.isFirst).toBe(true);
81
- expect(result.relatedEntries).toHaveLength(0);
82
- });
83
- it('populates relatedEntries from orient response, max 3', async () => {
84
- mockReadSession.mockReturnValue({
85
- ...baseSession,
86
- entriesCaptured: ['INS-1'],
87
- });
88
- mockMcpCall.mockResolvedValue({
89
- activeWorkPackages: [
90
- { entryId: 'BET-1', name: 'Bet one', collectionSlug: 'work-packages' },
91
- { entryId: 'BET-2', name: 'Bet two', collectionSlug: 'work-packages' },
92
- { entryId: 'STD-3', name: 'Standard three', collectionSlug: 'standards' },
93
- { entryId: 'TEN-4', name: 'Tension four', collectionSlug: 'tensions' },
94
- ],
95
- });
96
- const result = await checkActivation('INS-1');
97
- expect(result).not.toBeNull();
98
- expect(result.relatedEntries).toHaveLength(3);
99
- expect(result.relatedEntries.map(e => e.entryId)).toEqual(['BET-1', 'BET-2', 'STD-3']);
100
- });
101
- it('returns activation with empty relations when orient returns empty', async () => {
102
- mockReadSession.mockReturnValue({
103
- ...baseSession,
104
- entriesCaptured: ['TEN-42'],
105
- });
106
- mockMcpCall.mockResolvedValue({ activeWorkPackages: [] });
107
- const result = await checkActivation('TEN-42');
108
- expect(result).not.toBeNull();
109
- expect(result.isFirst).toBe(true);
110
- expect(result.relatedEntries).toHaveLength(0);
111
- });
112
- it('returns null when session entry does not match the entryId argument', async () => {
113
- mockReadSession.mockReturnValue({
114
- ...baseSession,
115
- entriesCaptured: ['OTHER-1'],
116
- });
117
- const result = await checkActivation('TEN-42');
118
- expect(result).toBeNull();
119
- });
120
- });
121
- //# sourceMappingURL=activation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activation.test.js","sourceRoot":"","sources":["../../src/lib/activation.test.ts"],"names":[],"mappings":"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"}