@itaila/archetype 0.3.30
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/LICENSE +21 -0
- package/README.md +475 -0
- package/dist/audit/audit-persona.d.ts +163 -0
- package/dist/audit/audit-persona.d.ts.map +1 -0
- package/dist/audit/audit-persona.js +415 -0
- package/dist/audit/audit-persona.js.map +1 -0
- package/dist/audit/brain-reflection.d.ts +33 -0
- package/dist/audit/brain-reflection.d.ts.map +1 -0
- package/dist/audit/brain-reflection.js +148 -0
- package/dist/audit/brain-reflection.js.map +1 -0
- package/dist/audit/conversation-audit.d.ts +12 -0
- package/dist/audit/conversation-audit.d.ts.map +1 -0
- package/dist/audit/conversation-audit.js +76 -0
- package/dist/audit/conversation-audit.js.map +1 -0
- package/dist/audit/prompt-audit.d.ts +10 -0
- package/dist/audit/prompt-audit.d.ts.map +1 -0
- package/dist/audit/prompt-audit.js +153 -0
- package/dist/audit/prompt-audit.js.map +1 -0
- package/dist/audit/prompt-dump.d.ts +137 -0
- package/dist/audit/prompt-dump.d.ts.map +1 -0
- package/dist/audit/prompt-dump.js +269 -0
- package/dist/audit/prompt-dump.js.map +1 -0
- package/dist/audit/trace-integrity.d.ts +33 -0
- package/dist/audit/trace-integrity.d.ts.map +1 -0
- package/dist/audit/trace-integrity.js +109 -0
- package/dist/audit/trace-integrity.js.map +1 -0
- package/dist/audit/types.d.ts +92 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +2 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/version.d.ts +14 -0
- package/dist/audit/version.d.ts.map +1 -0
- package/dist/audit/version.js +65 -0
- package/dist/audit/version.js.map +1 -0
- package/dist/brain.d.ts +7 -0
- package/dist/brain.d.ts.map +1 -0
- package/dist/brain.js +83 -0
- package/dist/brain.js.map +1 -0
- package/dist/builder/actions.d.ts +60 -0
- package/dist/builder/actions.d.ts.map +1 -0
- package/dist/builder/actions.js +257 -0
- package/dist/builder/actions.js.map +1 -0
- package/dist/builder/browser.d.ts +140 -0
- package/dist/builder/browser.d.ts.map +1 -0
- package/dist/builder/browser.js +232 -0
- package/dist/builder/browser.js.map +1 -0
- package/dist/builder/executor.d.ts +228 -0
- package/dist/builder/executor.d.ts.map +1 -0
- package/dist/builder/executor.js +1548 -0
- package/dist/builder/executor.js.map +1 -0
- package/dist/builder/index.d.ts +24 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +24 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/node-test-discovery.d.ts +13 -0
- package/dist/builder/node-test-discovery.d.ts.map +1 -0
- package/dist/builder/node-test-discovery.js +45 -0
- package/dist/builder/node-test-discovery.js.map +1 -0
- package/dist/builder/sandbox.d.ts +172 -0
- package/dist/builder/sandbox.d.ts.map +1 -0
- package/dist/builder/sandbox.js +294 -0
- package/dist/builder/sandbox.js.map +1 -0
- package/dist/builder/workspace-files.d.ts +63 -0
- package/dist/builder/workspace-files.d.ts.map +1 -0
- package/dist/builder/workspace-files.js +190 -0
- package/dist/builder/workspace-files.js.map +1 -0
- package/dist/core/actions.d.ts +55 -0
- package/dist/core/actions.d.ts.map +1 -0
- package/dist/core/actions.js +311 -0
- package/dist/core/actions.js.map +1 -0
- package/dist/core/attachment-notes.d.ts +7 -0
- package/dist/core/attachment-notes.d.ts.map +1 -0
- package/dist/core/attachment-notes.js +38 -0
- package/dist/core/attachment-notes.js.map +1 -0
- package/dist/core/context.d.ts +10 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +108 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/crud-prompt.d.ts +16 -0
- package/dist/core/crud-prompt.d.ts.map +1 -0
- package/dist/core/crud-prompt.js +268 -0
- package/dist/core/crud-prompt.js.map +1 -0
- package/dist/core/crud-schema.d.ts +12 -0
- package/dist/core/crud-schema.d.ts.map +1 -0
- package/dist/core/crud-schema.js +42 -0
- package/dist/core/crud-schema.js.map +1 -0
- package/dist/core/effective-config.d.ts +13 -0
- package/dist/core/effective-config.d.ts.map +1 -0
- package/dist/core/effective-config.js +33 -0
- package/dist/core/effective-config.js.map +1 -0
- package/dist/core/entities.d.ts +82 -0
- package/dist/core/entities.d.ts.map +1 -0
- package/dist/core/entities.js +116 -0
- package/dist/core/entities.js.map +1 -0
- package/dist/core/entity-helpers.d.ts +47 -0
- package/dist/core/entity-helpers.d.ts.map +1 -0
- package/dist/core/entity-helpers.js +122 -0
- package/dist/core/entity-helpers.js.map +1 -0
- package/dist/core/entity-registry.d.ts +47 -0
- package/dist/core/entity-registry.d.ts.map +1 -0
- package/dist/core/entity-registry.js +54 -0
- package/dist/core/entity-registry.js.map +1 -0
- package/dist/core/eq.d.ts +13 -0
- package/dist/core/eq.d.ts.map +1 -0
- package/dist/core/eq.js +41 -0
- package/dist/core/eq.js.map +1 -0
- package/dist/core/focus-context.d.ts +19 -0
- package/dist/core/focus-context.d.ts.map +1 -0
- package/dist/core/focus-context.js +46 -0
- package/dist/core/focus-context.js.map +1 -0
- package/dist/core/focus-mode-actions.d.ts +23 -0
- package/dist/core/focus-mode-actions.d.ts.map +1 -0
- package/dist/core/focus-mode-actions.js +74 -0
- package/dist/core/focus-mode-actions.js.map +1 -0
- package/dist/core/greeting.d.ts +10 -0
- package/dist/core/greeting.d.ts.map +1 -0
- package/dist/core/greeting.js +41 -0
- package/dist/core/greeting.js.map +1 -0
- package/dist/core/identity.d.ts +13 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +54 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/knowledge.d.ts +10 -0
- package/dist/core/knowledge.d.ts.map +1 -0
- package/dist/core/knowledge.js +40 -0
- package/dist/core/knowledge.js.map +1 -0
- package/dist/core/memory-actions.d.ts +38 -0
- package/dist/core/memory-actions.d.ts.map +1 -0
- package/dist/core/memory-actions.js +181 -0
- package/dist/core/memory-actions.js.map +1 -0
- package/dist/core/memory.d.ts +35 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +168 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/peer-actions.d.ts +15 -0
- package/dist/core/peer-actions.d.ts.map +1 -0
- package/dist/core/peer-actions.js +33 -0
- package/dist/core/peer-actions.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +46 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +543 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/prompt-mode.d.ts +3 -0
- package/dist/core/prompt-mode.d.ts.map +1 -0
- package/dist/core/prompt-mode.js +6 -0
- package/dist/core/prompt-mode.js.map +1 -0
- package/dist/core/prompted-turn.d.ts +6 -0
- package/dist/core/prompted-turn.d.ts.map +1 -0
- package/dist/core/prompted-turn.js +48 -0
- package/dist/core/prompted-turn.js.map +1 -0
- package/dist/core/request-builder.d.ts +14 -0
- package/dist/core/request-builder.d.ts.map +1 -0
- package/dist/core/request-builder.js +64 -0
- package/dist/core/request-builder.js.map +1 -0
- package/dist/core/session-routing.d.ts +23 -0
- package/dist/core/session-routing.d.ts.map +1 -0
- package/dist/core/session-routing.js +59 -0
- package/dist/core/session-routing.js.map +1 -0
- package/dist/core/voice.d.ts +6 -0
- package/dist/core/voice.d.ts.map +1 -0
- package/dist/core/voice.js +30 -0
- package/dist/core/voice.js.map +1 -0
- package/dist/engine/chat.d.ts +45 -0
- package/dist/engine/chat.d.ts.map +1 -0
- package/dist/engine/chat.js +308 -0
- package/dist/engine/chat.js.map +1 -0
- package/dist/engine/continuity.d.ts +107 -0
- package/dist/engine/continuity.d.ts.map +1 -0
- package/dist/engine/continuity.js +320 -0
- package/dist/engine/continuity.js.map +1 -0
- package/dist/engine/crud.d.ts +62 -0
- package/dist/engine/crud.d.ts.map +1 -0
- package/dist/engine/crud.js +260 -0
- package/dist/engine/crud.js.map +1 -0
- package/dist/engine/side-effects.d.ts +93 -0
- package/dist/engine/side-effects.d.ts.map +1 -0
- package/dist/engine/side-effects.js +271 -0
- package/dist/engine/side-effects.js.map +1 -0
- package/dist/engine/staging.d.ts +29 -0
- package/dist/engine/staging.d.ts.map +1 -0
- package/dist/engine/staging.js +159 -0
- package/dist/engine/staging.js.map +1 -0
- package/dist/engine/working-set.d.ts +18 -0
- package/dist/engine/working-set.d.ts.map +1 -0
- package/dist/engine/working-set.js +246 -0
- package/dist/engine/working-set.js.map +1 -0
- package/dist/evals/action-contracts.d.ts +40 -0
- package/dist/evals/action-contracts.d.ts.map +1 -0
- package/dist/evals/action-contracts.js +208 -0
- package/dist/evals/action-contracts.js.map +1 -0
- package/dist/evals/brain-bloat.d.ts +39 -0
- package/dist/evals/brain-bloat.d.ts.map +1 -0
- package/dist/evals/brain-bloat.js +167 -0
- package/dist/evals/brain-bloat.js.map +1 -0
- package/dist/evals/brain-prescriptions.d.ts +30 -0
- package/dist/evals/brain-prescriptions.d.ts.map +1 -0
- package/dist/evals/brain-prescriptions.js +148 -0
- package/dist/evals/brain-prescriptions.js.map +1 -0
- package/dist/evals/cross-layer-duplicates.d.ts +49 -0
- package/dist/evals/cross-layer-duplicates.d.ts.map +1 -0
- package/dist/evals/cross-layer-duplicates.js +289 -0
- package/dist/evals/cross-layer-duplicates.js.map +1 -0
- package/dist/evals/entity-visibility.d.ts +28 -0
- package/dist/evals/entity-visibility.d.ts.map +1 -0
- package/dist/evals/entity-visibility.js +216 -0
- package/dist/evals/entity-visibility.js.map +1 -0
- package/dist/evals/index.d.ts +19 -0
- package/dist/evals/index.d.ts.map +1 -0
- package/dist/evals/index.js +11 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evals/judge.d.ts +22 -0
- package/dist/evals/judge.d.ts.map +1 -0
- package/dist/evals/judge.js +337 -0
- package/dist/evals/judge.js.map +1 -0
- package/dist/evals/operational-contract.d.ts +40 -0
- package/dist/evals/operational-contract.d.ts.map +1 -0
- package/dist/evals/operational-contract.js +115 -0
- package/dist/evals/operational-contract.js.map +1 -0
- package/dist/evals/prompt-content.d.ts +14 -0
- package/dist/evals/prompt-content.d.ts.map +1 -0
- package/dist/evals/prompt-content.js +104 -0
- package/dist/evals/prompt-content.js.map +1 -0
- package/dist/evals/runtime.d.ts +4 -0
- package/dist/evals/runtime.d.ts.map +1 -0
- package/dist/evals/runtime.js +197 -0
- package/dist/evals/runtime.js.map +1 -0
- package/dist/evals/sample-projects.d.ts +143 -0
- package/dist/evals/sample-projects.d.ts.map +1 -0
- package/dist/evals/sample-projects.js +644 -0
- package/dist/evals/sample-projects.js.map +1 -0
- package/dist/evals/types.d.ts +88 -0
- package/dist/evals/types.d.ts.map +1 -0
- package/dist/evals/types.js +2 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/foundation/index.d.ts +158 -0
- package/dist/foundation/index.d.ts.map +1 -0
- package/dist/foundation/index.js +256 -0
- package/dist/foundation/index.js.map +1 -0
- package/dist/index.d.ts +223 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +998 -0
- package/dist/index.js.map +1 -0
- package/dist/managed/autonomous-loop.d.ts +199 -0
- package/dist/managed/autonomous-loop.d.ts.map +1 -0
- package/dist/managed/autonomous-loop.js +451 -0
- package/dist/managed/autonomous-loop.js.map +1 -0
- package/dist/managed/conversation.d.ts +20 -0
- package/dist/managed/conversation.d.ts.map +1 -0
- package/dist/managed/conversation.js +40 -0
- package/dist/managed/conversation.js.map +1 -0
- package/dist/managed/knowledge.d.ts +7 -0
- package/dist/managed/knowledge.d.ts.map +1 -0
- package/dist/managed/knowledge.js +174 -0
- package/dist/managed/knowledge.js.map +1 -0
- package/dist/managed/memory-manager.d.ts +7 -0
- package/dist/managed/memory-manager.d.ts.map +1 -0
- package/dist/managed/memory-manager.js +18 -0
- package/dist/managed/memory-manager.js.map +1 -0
- package/dist/managed/memory-review.d.ts +45 -0
- package/dist/managed/memory-review.d.ts.map +1 -0
- package/dist/managed/memory-review.js +130 -0
- package/dist/managed/memory-review.js.map +1 -0
- package/dist/managed/storage.d.ts +2 -0
- package/dist/managed/storage.d.ts.map +1 -0
- package/dist/managed/storage.js +2 -0
- package/dist/managed/storage.js.map +1 -0
- package/dist/managed/work-history.d.ts +23 -0
- package/dist/managed/work-history.d.ts.map +1 -0
- package/dist/managed/work-history.js +31 -0
- package/dist/managed/work-history.js.map +1 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +15 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/render-run-markdown.d.ts +90 -0
- package/dist/observability/render-run-markdown.d.ts.map +1 -0
- package/dist/observability/render-run-markdown.js +231 -0
- package/dist/observability/render-run-markdown.js.map +1 -0
- package/dist/observability/turn-reporter.d.ts +20 -0
- package/dist/observability/turn-reporter.d.ts.map +1 -0
- package/dist/observability/turn-reporter.js +106 -0
- package/dist/observability/turn-reporter.js.map +1 -0
- package/dist/persona.d.ts +49 -0
- package/dist/persona.d.ts.map +1 -0
- package/dist/persona.js +287 -0
- package/dist/persona.js.map +1 -0
- package/dist/playbook/defaults.d.ts +25 -0
- package/dist/playbook/defaults.d.ts.map +1 -0
- package/dist/playbook/defaults.js +108 -0
- package/dist/playbook/defaults.js.map +1 -0
- package/dist/playbook/invariants.d.ts +244 -0
- package/dist/playbook/invariants.d.ts.map +1 -0
- package/dist/playbook/invariants.js +259 -0
- package/dist/playbook/invariants.js.map +1 -0
- package/dist/playbook/templates.d.ts +7 -0
- package/dist/playbook/templates.d.ts.map +1 -0
- package/dist/playbook/templates.js +437 -0
- package/dist/playbook/templates.js.map +1 -0
- package/dist/providers/gemini.d.ts +73 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +536 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/types.d.ts +2 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/zod-to-gemini.d.ts +8 -0
- package/dist/providers/zod-to-gemini.d.ts.map +1 -0
- package/dist/providers/zod-to-gemini.js +148 -0
- package/dist/providers/zod-to-gemini.js.map +1 -0
- package/dist/samples/pm-spec-agent.d.ts +22 -0
- package/dist/samples/pm-spec-agent.d.ts.map +1 -0
- package/dist/samples/pm-spec-agent.js +53 -0
- package/dist/samples/pm-spec-agent.js.map +1 -0
- package/dist/types.d.ts +920 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const DEFAULT_KEYSTONE = 'What is the single most impactful thing you could say right now?';
|
|
2
|
+
const DEFAULT_RELATIONAL_PREAMBLE = 'You are an expert with a real person in front of you.';
|
|
3
|
+
/**
|
|
4
|
+
* Build the identity paragraph of the system prompt from persona config.
|
|
5
|
+
* This is the opening paragraph that sets expertise, relationship, and north star.
|
|
6
|
+
*
|
|
7
|
+
* DESIGN PRINCIPLE — Scenario-first, not directive-first.
|
|
8
|
+
* Identity stays neutral: who this expert is, what they weave together,
|
|
9
|
+
* and what they serve. Mode-specific presence/keystone hooks are layered
|
|
10
|
+
* separately so operational turns do not inherit conversation assumptions.
|
|
11
|
+
*/
|
|
12
|
+
export function buildIdentityBlock(identity) {
|
|
13
|
+
const { name, expertise, relationship, northStar, scopeBoundary } = identity;
|
|
14
|
+
const expertiseStr = joinNatural(expertise);
|
|
15
|
+
// If the persona's name already contains the expertise word (e.g.
|
|
16
|
+
// name="Coding Agent", expertise=["coding"]), restating "you bring deep
|
|
17
|
+
// expertise in coding" is redundant and reads like coaching a mediocre
|
|
18
|
+
// employee. Skip the expertise clause in that case — the name carries it.
|
|
19
|
+
const nameNorm = name.toLowerCase();
|
|
20
|
+
const expertiseAlreadyInName = expertise.some((e) => nameNorm.includes(e.toLowerCase()));
|
|
21
|
+
const lines = [];
|
|
22
|
+
if (expertiseAlreadyInName || expertise.length === 0) {
|
|
23
|
+
lines.push(`You are ${name} — a ${relationship}.`);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
lines.push(`You are ${name} — a ${relationship}. ` +
|
|
27
|
+
`You bring deep expertise in ${expertiseStr}.`);
|
|
28
|
+
}
|
|
29
|
+
lines.push(`Your north star is ${northStar}.`);
|
|
30
|
+
if (scopeBoundary) {
|
|
31
|
+
lines.push(scopeBoundary);
|
|
32
|
+
}
|
|
33
|
+
return lines.join('\n');
|
|
34
|
+
}
|
|
35
|
+
export function buildConversationKeystone(identity, relationalPreamble) {
|
|
36
|
+
const effectiveRelationalPreamble = relationalPreamble === undefined
|
|
37
|
+
? DEFAULT_RELATIONAL_PREAMBLE
|
|
38
|
+
: relationalPreamble;
|
|
39
|
+
if (effectiveRelationalPreamble === false)
|
|
40
|
+
return '';
|
|
41
|
+
const keystoneStr = identity.keystone ?? DEFAULT_KEYSTONE;
|
|
42
|
+
return `${effectiveRelationalPreamble} ${keystoneStr}`;
|
|
43
|
+
}
|
|
44
|
+
/** Join array items naturally: "a, b, and c" */
|
|
45
|
+
function joinNatural(items) {
|
|
46
|
+
if (items.length === 0)
|
|
47
|
+
return '';
|
|
48
|
+
if (items.length === 1)
|
|
49
|
+
return items[0];
|
|
50
|
+
if (items.length === 2)
|
|
51
|
+
return `${items[0]} and ${items[1]}`;
|
|
52
|
+
return `${items.slice(0, -1).join(', ')}, and ${items[items.length - 1]}`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GACpB,kEAAkE,CAAA;AACpE,MAAM,2BAA2B,GAC/B,uDAAuD,CAAA;AAEzD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAA;IAC5E,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;IAE3C,kEAAkE;IAClE,wEAAwE;IACxE,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IACnC,MAAM,sBAAsB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAExF,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,sBAAsB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,QAAQ,YAAY,GAAG,CAAC,CAAA;IACpD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,WAAW,IAAI,QAAQ,YAAY,IAAI;YACvC,+BAA+B,YAAY,GAAG,CAC/C,CAAA;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,sBAAsB,SAAS,GAAG,CAAC,CAAA;IAC9C,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAAyB,EACzB,kBAAmC;IAEnC,MAAM,2BAA2B,GAAG,kBAAkB,KAAK,SAAS;QAClE,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,kBAAkB,CAAA;IACtB,IAAI,2BAA2B,KAAK,KAAK;QAAE,OAAO,EAAE,CAAA;IAEpD,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,IAAI,gBAAgB,CAAA;IACzD,OAAO,GAAG,2BAA2B,IAAI,WAAW,EAAE,CAAA;AACxD,CAAC;AAED,gDAAgD;AAChD,SAAS,WAAW,CAAC,KAAe;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5D,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAA;AAC3E,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { KnowledgeDocument } from '../types.js';
|
|
2
|
+
export interface KnowledgeBlockOptions {
|
|
3
|
+
budget?: number;
|
|
4
|
+
maxDocuments?: number;
|
|
5
|
+
label?: string;
|
|
6
|
+
purpose?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function selectKnowledgeForPrompt(documents: KnowledgeDocument[], options?: KnowledgeBlockOptions): string[];
|
|
9
|
+
export declare function buildKnowledgeBlock(documents: KnowledgeDocument[], options?: KnowledgeBlockOptions): string;
|
|
10
|
+
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAKpD,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,EAAE,CAgBV;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAWR"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const DEFAULT_BUDGET = 6000;
|
|
2
|
+
const DEFAULT_MAX_DOCUMENTS = 12;
|
|
3
|
+
export function selectKnowledgeForPrompt(documents, options) {
|
|
4
|
+
const budget = options?.budget ?? DEFAULT_BUDGET;
|
|
5
|
+
const maxDocuments = options?.maxDocuments ?? DEFAULT_MAX_DOCUMENTS;
|
|
6
|
+
const selected = documents.slice(0, maxDocuments);
|
|
7
|
+
const result = [];
|
|
8
|
+
let charCount = 0;
|
|
9
|
+
for (const doc of selected) {
|
|
10
|
+
const block = formatKnowledgeDocument(doc);
|
|
11
|
+
if (charCount + block.length > budget)
|
|
12
|
+
continue;
|
|
13
|
+
result.push(block);
|
|
14
|
+
charCount += block.length;
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
export function buildKnowledgeBlock(documents, options) {
|
|
19
|
+
const label = options?.label ?? 'KNOWLEDGE';
|
|
20
|
+
const selected = selectKnowledgeForPrompt(documents, options);
|
|
21
|
+
if (selected.length === 0)
|
|
22
|
+
return '';
|
|
23
|
+
const purpose = options?.purpose?.trim();
|
|
24
|
+
const purposeLine = purpose
|
|
25
|
+
? `Use this shared knowledge for ${purpose}.`
|
|
26
|
+
: 'Use this shared knowledge as grounded reference. Prefer claims supported here over improvised specifics.';
|
|
27
|
+
return `--- ${label} (durable shared reference) ---\n${purposeLine} If it is silent, ambiguous, or provisional, say less and frame uncertainty rather than inventing specifics.\n${selected.join('\n\n')}`;
|
|
28
|
+
}
|
|
29
|
+
function formatKnowledgeDocument(document) {
|
|
30
|
+
const titleParts = [document.title.trim()];
|
|
31
|
+
if (document.id)
|
|
32
|
+
titleParts.push(`id:${document.id}`);
|
|
33
|
+
if (document.status)
|
|
34
|
+
titleParts.push(`status:${document.status}`);
|
|
35
|
+
if (document.tags?.length)
|
|
36
|
+
titleParts.push(`tags:${document.tags.join(', ')}`);
|
|
37
|
+
const body = (document.summary?.trim() || document.content.trim()).trim();
|
|
38
|
+
return `[${titleParts.join(' | ')}]\n${body}`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/core/knowledge.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,IAAI,CAAA;AAC3B,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAShC,MAAM,UAAU,wBAAwB,CACtC,SAA8B,EAC9B,OAA+B;IAE/B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,cAAc,CAAA;IAChD,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,qBAAqB,CAAA;IACnE,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;IAEjD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM;YAAE,SAAQ;QAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAA;IAC3B,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,SAA8B,EAC9B,OAA+B;IAE/B,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,WAAW,CAAA;IAC3C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEpC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACxC,MAAM,WAAW,GAAG,OAAO;QACzB,CAAC,CAAC,iCAAiC,OAAO,GAAG;QAC7C,CAAC,CAAC,0GAA0G,CAAA;IAE9G,OAAO,OAAO,KAAK,oCAAoC,WAAW,iHAAiH,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;AAC5M,CAAC;AAED,SAAS,uBAAuB,CAAC,QAA2B;IAC1D,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1C,IAAI,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;IACrD,IAAI,QAAQ,CAAC,MAAM;QAAE,UAAU,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IACjE,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAE9E,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACzE,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ActionDefinition, EntityConfig } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build the category description string for the saveMemory action schema.
|
|
4
|
+
* When custom categories are defined, lists them with descriptions.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildCategoryDescription(categories?: Record<string, string>): string;
|
|
7
|
+
/**
|
|
8
|
+
* Built-in legacy memory actions.
|
|
9
|
+
* Archetype's foundation path is CRUD-native memory entities.
|
|
10
|
+
* These named actions remain available for older integrations that still
|
|
11
|
+
* expose memory as named actions instead of entities.
|
|
12
|
+
*/
|
|
13
|
+
export declare const MEMORY_ACTIONS: Record<string, ActionDefinition>;
|
|
14
|
+
/**
|
|
15
|
+
* Build memory actions with custom category descriptions.
|
|
16
|
+
* Returns the default MEMORY_ACTIONS when no custom categories are defined.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildMemoryActions(categories?: Record<string, string>): Record<string, ActionDefinition>;
|
|
19
|
+
/** Action names that are built-in memory actions (for auto-handling in managed mode) */
|
|
20
|
+
export declare const MEMORY_ACTION_NAMES: Set<string>;
|
|
21
|
+
export declare const CRAFT_MEMORY_ACTIONS: Record<string, ActionDefinition>;
|
|
22
|
+
/**
|
|
23
|
+
* Build craft memory actions with custom category descriptions.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildCraftMemoryActions(categories?: Record<string, string>): Record<string, ActionDefinition>;
|
|
26
|
+
/** Action names that are built-in craft memory actions */
|
|
27
|
+
export declare const CRAFT_MEMORY_ACTION_NAMES: Set<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Build a memory entity config for the generic CRUD system.
|
|
30
|
+
* Memory is registered as an internal entity when memory is enabled so
|
|
31
|
+
* durable memory mutations flow through CRUD.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildMemoryEntityConfig(categories?: Record<string, string>): EntityConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Build a craft memory entity config for the generic CRUD system.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildCraftMemoryEntityConfig(categories?: Record<string, string>): EntityConfig;
|
|
38
|
+
//# sourceMappingURL=memory-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-actions.d.ts","sourceRoot":"","sources":["../../src/core/memory-actions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAIjE;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQpF;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA+B3D,CAAA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAkBxG;AAED,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,aAAuC,CAAA;AAgBvE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA+BjE,CAAA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAkB7G;AAED,0DAA0D;AAC1D,eAAO,MAAM,yBAAyB,aAA6C,CAAA;AAInF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAazF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAa9F"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const DEFAULT_CATEGORIES = 'approach | commitment | pattern | context | preference | values | general';
|
|
3
|
+
/**
|
|
4
|
+
* Build the category description string for the saveMemory action schema.
|
|
5
|
+
* When custom categories are defined, lists them with descriptions.
|
|
6
|
+
*/
|
|
7
|
+
export function buildCategoryDescription(categories) {
|
|
8
|
+
if (!categories || Object.keys(categories).length === 0) {
|
|
9
|
+
return `Category: ${DEFAULT_CATEGORIES}`;
|
|
10
|
+
}
|
|
11
|
+
const entries = Object.entries(categories)
|
|
12
|
+
.map(([name, desc]) => `${name} (${desc})`)
|
|
13
|
+
.join(' | ');
|
|
14
|
+
return `Category: ${entries}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Built-in legacy memory actions.
|
|
18
|
+
* Archetype's foundation path is CRUD-native memory entities.
|
|
19
|
+
* These named actions remain available for older integrations that still
|
|
20
|
+
* expose memory as named actions instead of entities.
|
|
21
|
+
*/
|
|
22
|
+
export const MEMORY_ACTIONS = {
|
|
23
|
+
saveMemory: {
|
|
24
|
+
description: 'Save a new durable insight about the user that you want to remember across future conversations.',
|
|
25
|
+
schema: z.object({
|
|
26
|
+
content: z.string().describe('The insight to remember — single concise sentence'),
|
|
27
|
+
category: z.string().describe(`Category: ${DEFAULT_CATEGORIES}`),
|
|
28
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional().describe('Optional: where this memory comes from. Use "user" when they explicitly said it, "inferred" when you noticed a pattern, "suggested" when this is an agent-proposed idea not clearly adopted yet.'),
|
|
29
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional().describe('Time horizon: "durable" for reliable truths, "tentative" for still-forming patterns, "temporary" for situation-bound facts.'),
|
|
30
|
+
contextHint: z.string().optional().describe('Optional: a very short situational frame when needed to keep the memory interpretable later. Not a transcript.'),
|
|
31
|
+
}),
|
|
32
|
+
confidence: 'low',
|
|
33
|
+
},
|
|
34
|
+
updateMemory: {
|
|
35
|
+
description: 'Update an existing memory by ID when information has changed or evolved. Reference the (id:xxx) from the MEMORY section.',
|
|
36
|
+
schema: z.object({
|
|
37
|
+
id: z.string().describe('The memory ID to update (from the MEMORY section)'),
|
|
38
|
+
content: z.string().optional().describe('The updated content'),
|
|
39
|
+
category: z.string().optional().describe(`Category: ${DEFAULT_CATEGORIES}`),
|
|
40
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional(),
|
|
41
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional(),
|
|
42
|
+
contextHint: z.string().optional(),
|
|
43
|
+
}),
|
|
44
|
+
confidence: 'low',
|
|
45
|
+
},
|
|
46
|
+
deleteMemory: {
|
|
47
|
+
description: 'Delete a memory that is no longer accurate or relevant. Reference the (id:xxx) from the MEMORY section.',
|
|
48
|
+
schema: z.object({
|
|
49
|
+
id: z.string().describe('The memory ID to delete (from the MEMORY section)'),
|
|
50
|
+
}),
|
|
51
|
+
confidence: 'low',
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Build memory actions with custom category descriptions.
|
|
56
|
+
* Returns the default MEMORY_ACTIONS when no custom categories are defined.
|
|
57
|
+
*/
|
|
58
|
+
export function buildMemoryActions(categories) {
|
|
59
|
+
if (!categories || Object.keys(categories).length === 0) {
|
|
60
|
+
return MEMORY_ACTIONS;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
...MEMORY_ACTIONS,
|
|
64
|
+
saveMemory: {
|
|
65
|
+
...MEMORY_ACTIONS.saveMemory,
|
|
66
|
+
schema: z.object({
|
|
67
|
+
content: z.string().describe('The insight to remember — single concise sentence'),
|
|
68
|
+
category: z.string().describe(buildCategoryDescription(categories)),
|
|
69
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional().describe('Optional: where this memory comes from.'),
|
|
70
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional().describe('Optional: how strongly this memory should shape future judgment.'),
|
|
71
|
+
contextHint: z.string().optional().describe('Optional: compact situational frame when the memory needs context to stay interpretable later.'),
|
|
72
|
+
}),
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Action names that are built-in memory actions (for auto-handling in managed mode) */
|
|
77
|
+
export const MEMORY_ACTION_NAMES = new Set(Object.keys(MEMORY_ACTIONS));
|
|
78
|
+
// ─── Craft Memory Actions ───────────────────────────────────────────────────
|
|
79
|
+
const DEFAULT_CRAFT_CATEGORIES = 'approach | timing | pattern | insight | general';
|
|
80
|
+
function buildCraftCategoryDescription(categories) {
|
|
81
|
+
if (!categories || Object.keys(categories).length === 0) {
|
|
82
|
+
return `Category: ${DEFAULT_CRAFT_CATEGORIES}`;
|
|
83
|
+
}
|
|
84
|
+
const entries = Object.entries(categories)
|
|
85
|
+
.map(([name, desc]) => `${name} (${desc})`)
|
|
86
|
+
.join(' | ');
|
|
87
|
+
return `Category: ${entries}`;
|
|
88
|
+
}
|
|
89
|
+
export const CRAFT_MEMORY_ACTIONS = {
|
|
90
|
+
saveCraftMemory: {
|
|
91
|
+
description: 'Save a professional growth observation — something you learned about your own craft that would make you better across all future conversations.',
|
|
92
|
+
schema: z.object({
|
|
93
|
+
content: z.string().describe('The craft observation — a concise, transferable insight'),
|
|
94
|
+
category: z.string().describe(`Category: ${DEFAULT_CRAFT_CATEGORIES}`),
|
|
95
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional().describe('Optional: where this craft observation came from. Usually "inferred".'),
|
|
96
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional().describe('Time horizon: "durable" for reliable practice-level patterns, "tentative" for still-forming observations, "temporary" for observations tied to a specific moment or phase.'),
|
|
97
|
+
contextHint: z.string().optional().describe('Optional: very short situational frame when needed to keep the observation honest.'),
|
|
98
|
+
}),
|
|
99
|
+
confidence: 'low',
|
|
100
|
+
},
|
|
101
|
+
updateCraftMemory: {
|
|
102
|
+
description: 'Update an existing craft memory by ID when the observation has evolved or sharpened. Reference the (id:xxx) from the CRAFT MEMORY section.',
|
|
103
|
+
schema: z.object({
|
|
104
|
+
id: z.string().describe('The craft memory ID to update'),
|
|
105
|
+
content: z.string().optional().describe('The updated observation'),
|
|
106
|
+
category: z.string().optional().describe(`Category: ${DEFAULT_CRAFT_CATEGORIES}`),
|
|
107
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional(),
|
|
108
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional(),
|
|
109
|
+
contextHint: z.string().optional(),
|
|
110
|
+
}),
|
|
111
|
+
confidence: 'low',
|
|
112
|
+
},
|
|
113
|
+
deleteCraftMemory: {
|
|
114
|
+
description: 'Delete a craft memory that turned out to be situational noise, not a real pattern. Reference the (id:xxx) from the CRAFT MEMORY section.',
|
|
115
|
+
schema: z.object({
|
|
116
|
+
id: z.string().describe('The craft memory ID to delete'),
|
|
117
|
+
}),
|
|
118
|
+
confidence: 'low',
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Build craft memory actions with custom category descriptions.
|
|
123
|
+
*/
|
|
124
|
+
export function buildCraftMemoryActions(categories) {
|
|
125
|
+
if (!categories || Object.keys(categories).length === 0) {
|
|
126
|
+
return CRAFT_MEMORY_ACTIONS;
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
...CRAFT_MEMORY_ACTIONS,
|
|
130
|
+
saveCraftMemory: {
|
|
131
|
+
...CRAFT_MEMORY_ACTIONS.saveCraftMemory,
|
|
132
|
+
schema: z.object({
|
|
133
|
+
content: z.string().describe('The craft observation — a concise, transferable insight'),
|
|
134
|
+
category: z.string().describe(buildCraftCategoryDescription(categories)),
|
|
135
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional().describe('Optional: where this craft observation came from.'),
|
|
136
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional().describe('Optional: how strongly this observation should shape your practice.'),
|
|
137
|
+
contextHint: z.string().optional().describe('Optional: compact situational frame when needed.'),
|
|
138
|
+
}),
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/** Action names that are built-in craft memory actions */
|
|
143
|
+
export const CRAFT_MEMORY_ACTION_NAMES = new Set(Object.keys(CRAFT_MEMORY_ACTIONS));
|
|
144
|
+
// ─── Entity schemas for memory CRUD ────────────────────────────────────────
|
|
145
|
+
/**
|
|
146
|
+
* Build a memory entity config for the generic CRUD system.
|
|
147
|
+
* Memory is registered as an internal entity when memory is enabled so
|
|
148
|
+
* durable memory mutations flow through CRUD.
|
|
149
|
+
*/
|
|
150
|
+
export function buildMemoryEntityConfig(categories) {
|
|
151
|
+
return {
|
|
152
|
+
schema: z.object({
|
|
153
|
+
content: z.string().describe('The insight to remember — single concise sentence'),
|
|
154
|
+
category: z.string().describe(buildCategoryDescription(categories)),
|
|
155
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional().describe('Optional: where this memory came from.'),
|
|
156
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional().describe('Optional: how strongly this memory should shape future judgment.'),
|
|
157
|
+
contextHint: z.string().optional().describe('Optional: a compact situational frame when the memory needs context to stay interpretable later.'),
|
|
158
|
+
}),
|
|
159
|
+
label: 'Memory',
|
|
160
|
+
displayField: 'content',
|
|
161
|
+
description: 'Durable insights about the user worth remembering across future conversations',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Build a craft memory entity config for the generic CRUD system.
|
|
166
|
+
*/
|
|
167
|
+
export function buildCraftMemoryEntityConfig(categories) {
|
|
168
|
+
return {
|
|
169
|
+
schema: z.object({
|
|
170
|
+
content: z.string().describe('The craft observation — a concise, transferable insight'),
|
|
171
|
+
category: z.string().describe(buildCraftCategoryDescription(categories)),
|
|
172
|
+
source: z.enum(['user', 'inferred', 'suggested']).optional().describe('Optional: where this craft observation came from.'),
|
|
173
|
+
stability: z.enum(['durable', 'tentative', 'temporary']).optional().describe('Optional: how strongly this observation should shape your practice.'),
|
|
174
|
+
contextHint: z.string().optional().describe('Optional: compact situational frame when needed.'),
|
|
175
|
+
}),
|
|
176
|
+
label: 'Craft Memory',
|
|
177
|
+
displayField: 'content',
|
|
178
|
+
description: 'Professional growth observations about your own craft — transferable across all users',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=memory-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-actions.js","sourceRoot":"","sources":["../../src/core/memory-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Memory } from '../types.js';
|
|
2
|
+
export interface MemoryBlockOptions {
|
|
3
|
+
budget?: number;
|
|
4
|
+
maxEntries?: number;
|
|
5
|
+
label?: string;
|
|
6
|
+
/** When true, include memory IDs in the prompt for AI-driven update/delete */
|
|
7
|
+
includeIds?: boolean;
|
|
8
|
+
/** Priority strategy: 'pinned-first' (default) splits pinned/unpinned then sorts by recency;
|
|
9
|
+
* 'recent-first' sorts all memories by recency regardless of pinned status. */
|
|
10
|
+
prioritize?: 'pinned-first' | 'recent-first';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Load memories for prompt injection, respecting budget and prioritization.
|
|
14
|
+
* Respects character budget and entry limit.
|
|
15
|
+
*
|
|
16
|
+
* Prioritization strategies:
|
|
17
|
+
* - 'pinned-first' (default): pinned memories first, then unpinned; each group sorted by createdAt desc.
|
|
18
|
+
* - 'recent-first': all memories sorted by createdAt desc regardless of pinned status.
|
|
19
|
+
*/
|
|
20
|
+
export declare function selectMemoriesForPrompt(memories: Memory[], options?: MemoryBlockOptions): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Format selected memories into a prompt section.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildMemoryBlock(memories: Memory[], options?: MemoryBlockOptions): string;
|
|
25
|
+
/**
|
|
26
|
+
* Infer the best category for a memory text based on keyword matching.
|
|
27
|
+
* Returns 'general' if no strong signal.
|
|
28
|
+
*
|
|
29
|
+
* When `customKeywords` is provided, uses those for keyword matching.
|
|
30
|
+
* When `categoryNames` is provided (from MemoryConfig.categories),
|
|
31
|
+
* does simple name matching against the text as a lightweight fallback
|
|
32
|
+
* after keyword matching.
|
|
33
|
+
*/
|
|
34
|
+
export declare function inferMemoryCategory(text: string, customKeywords?: Record<string, string[]>, categoryNames?: string[]): string;
|
|
35
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAKzC,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8EAA8E;IAC9E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;oFACgF;IAChF,UAAU,CAAC,EAAE,cAAc,GAAG,cAAc,CAAA;CAC7C;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,MAAM,EAAE,CAiCV;AAqDD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,MAAM,CAMR;AAkCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACzC,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,CA4BR"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
const DEFAULT_BUDGET = 8000;
|
|
2
|
+
const DEFAULT_MAX_ENTRIES = 200;
|
|
3
|
+
/**
|
|
4
|
+
* Load memories for prompt injection, respecting budget and prioritization.
|
|
5
|
+
* Respects character budget and entry limit.
|
|
6
|
+
*
|
|
7
|
+
* Prioritization strategies:
|
|
8
|
+
* - 'pinned-first' (default): pinned memories first, then unpinned; each group sorted by createdAt desc.
|
|
9
|
+
* - 'recent-first': all memories sorted by createdAt desc regardless of pinned status.
|
|
10
|
+
*/
|
|
11
|
+
export function selectMemoriesForPrompt(memories, options) {
|
|
12
|
+
const budget = options?.budget ?? DEFAULT_BUDGET;
|
|
13
|
+
const maxEntries = options?.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
14
|
+
const includeIds = options?.includeIds ?? false;
|
|
15
|
+
const strategy = options?.prioritize ?? 'pinned-first';
|
|
16
|
+
let sorted;
|
|
17
|
+
if (strategy === 'recent-first') {
|
|
18
|
+
sorted = [...memories].sort(byCreatedAtDesc);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// pinned-first: split, then sort by salience inside each group
|
|
22
|
+
const pinned = memories.filter(m => m.pinned).sort(byMemorySalience);
|
|
23
|
+
const unpinned = memories.filter(m => !m.pinned).sort(byMemorySalience);
|
|
24
|
+
sorted = [...pinned, ...unpinned];
|
|
25
|
+
}
|
|
26
|
+
sorted = sorted.slice(0, maxEntries);
|
|
27
|
+
const result = [];
|
|
28
|
+
let charCount = 0;
|
|
29
|
+
for (const mem of sorted) {
|
|
30
|
+
const idPart = includeIds ? ` (id:${mem.id})` : '';
|
|
31
|
+
const metadata = buildMemoryMetadataLabel(mem);
|
|
32
|
+
const contextPart = mem.contextHint?.trim() ? ` (context: ${mem.contextHint.trim()})` : '';
|
|
33
|
+
const line = `[${mem.category}${metadata}]${idPart} ${mem.content}${contextPart}`;
|
|
34
|
+
if (charCount + line.length > budget)
|
|
35
|
+
break;
|
|
36
|
+
result.push(line);
|
|
37
|
+
charCount += line.length;
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
/** Sort by createdAt descending (most recent first). Memories without createdAt sort last. */
|
|
42
|
+
function byCreatedAtDesc(a, b) {
|
|
43
|
+
if (!a.createdAt && !b.createdAt)
|
|
44
|
+
return 0;
|
|
45
|
+
if (!a.createdAt)
|
|
46
|
+
return 1;
|
|
47
|
+
if (!b.createdAt)
|
|
48
|
+
return -1;
|
|
49
|
+
return b.createdAt.localeCompare(a.createdAt);
|
|
50
|
+
}
|
|
51
|
+
function byMemorySalience(a, b) {
|
|
52
|
+
const stabilityDiff = stabilityRank(b.stability) - stabilityRank(a.stability);
|
|
53
|
+
if (stabilityDiff !== 0)
|
|
54
|
+
return stabilityDiff;
|
|
55
|
+
const sourceDiff = sourceRank(b.source) - sourceRank(a.source);
|
|
56
|
+
if (sourceDiff !== 0)
|
|
57
|
+
return sourceDiff;
|
|
58
|
+
return byCreatedAtDesc(a, b);
|
|
59
|
+
}
|
|
60
|
+
function stabilityRank(stability) {
|
|
61
|
+
switch (stability) {
|
|
62
|
+
case 'durable':
|
|
63
|
+
return 3;
|
|
64
|
+
case 'tentative':
|
|
65
|
+
return 2;
|
|
66
|
+
case 'temporary':
|
|
67
|
+
return 1;
|
|
68
|
+
default:
|
|
69
|
+
return 2;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function sourceRank(source) {
|
|
73
|
+
switch (source) {
|
|
74
|
+
case 'user':
|
|
75
|
+
return 3;
|
|
76
|
+
case 'inferred':
|
|
77
|
+
return 2;
|
|
78
|
+
case 'suggested':
|
|
79
|
+
return 1;
|
|
80
|
+
default:
|
|
81
|
+
return 2;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function buildMemoryMetadataLabel(memory) {
|
|
85
|
+
const parts = [];
|
|
86
|
+
if (memory.source)
|
|
87
|
+
parts.push(`source:${memory.source}`);
|
|
88
|
+
if (memory.stability)
|
|
89
|
+
parts.push(`stability:${memory.stability}`);
|
|
90
|
+
return parts.length > 0 ? ` | ${parts.join(' | ')}` : '';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Format selected memories into a prompt section.
|
|
94
|
+
*/
|
|
95
|
+
export function buildMemoryBlock(memories, options) {
|
|
96
|
+
const label = options?.label ?? 'MEMORY';
|
|
97
|
+
const selected = selectMemoriesForPrompt(memories, options);
|
|
98
|
+
if (selected.length === 0)
|
|
99
|
+
return '';
|
|
100
|
+
return `--- ${label} (what you've learned about this person) ---\nYour accumulated understanding from working with them.\n${selected.join('\n')}`;
|
|
101
|
+
}
|
|
102
|
+
// ─── Category inference ──────────────────────────────────────────────────────
|
|
103
|
+
const DEFAULT_CATEGORY_KEYWORDS = {
|
|
104
|
+
approach: [
|
|
105
|
+
'responds well to', 'resists', 'shuts down when', 'push harder', 'pull back',
|
|
106
|
+
'framing that works', 'approach that works', 'landed well', 'style that works',
|
|
107
|
+
'softer', 'direct pushback',
|
|
108
|
+
],
|
|
109
|
+
commitment: [
|
|
110
|
+
"said he'd", 'committed to', 'this week', 'promised to', 'going to confront',
|
|
111
|
+
'will stop', "next time i'll", 'i need to stop', "i'll",
|
|
112
|
+
],
|
|
113
|
+
pattern: [
|
|
114
|
+
'across threads', 'keeps showing up', 'systemic', 'multiple', 'recurring across',
|
|
115
|
+
'pattern spanning', 'cross-cutting', 'connected to',
|
|
116
|
+
],
|
|
117
|
+
context: [
|
|
118
|
+
'optimizing for', 'trade-off', 'current bet', 'strategic frame', 'north star',
|
|
119
|
+
'what matters most', 'key assumption', 'thesis',
|
|
120
|
+
],
|
|
121
|
+
preference: [
|
|
122
|
+
'prefers', 'likes to', 'works best when', 'communication style', 'wants to be',
|
|
123
|
+
'rather than', 'comfortable with', 'hates when', 'pet peeve', 'processing style',
|
|
124
|
+
'think out loud', 'needs space',
|
|
125
|
+
],
|
|
126
|
+
values: [
|
|
127
|
+
'believes in', 'cares about', 'matters more than', 'integrity', 'transparency',
|
|
128
|
+
'proud of', 'stands for', 'deeply values', 'non-negotiable', 'kind of leader',
|
|
129
|
+
'kind of company',
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Infer the best category for a memory text based on keyword matching.
|
|
134
|
+
* Returns 'general' if no strong signal.
|
|
135
|
+
*
|
|
136
|
+
* When `customKeywords` is provided, uses those for keyword matching.
|
|
137
|
+
* When `categoryNames` is provided (from MemoryConfig.categories),
|
|
138
|
+
* does simple name matching against the text as a lightweight fallback
|
|
139
|
+
* after keyword matching.
|
|
140
|
+
*/
|
|
141
|
+
export function inferMemoryCategory(text, customKeywords, categoryNames) {
|
|
142
|
+
const keywords = customKeywords ?? DEFAULT_CATEGORY_KEYWORDS;
|
|
143
|
+
const lower = text.toLowerCase();
|
|
144
|
+
let best = 'general';
|
|
145
|
+
let bestScore = 0;
|
|
146
|
+
for (const [category, kws] of Object.entries(keywords)) {
|
|
147
|
+
let score = 0;
|
|
148
|
+
for (const kw of kws) {
|
|
149
|
+
if (lower.includes(kw))
|
|
150
|
+
score++;
|
|
151
|
+
}
|
|
152
|
+
if (score > bestScore) {
|
|
153
|
+
bestScore = score;
|
|
154
|
+
best = category;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// If keyword matching found nothing and we have domain categories,
|
|
158
|
+
// try simple name matching as a fallback
|
|
159
|
+
if (best === 'general' && categoryNames && categoryNames.length > 0) {
|
|
160
|
+
for (const name of categoryNames) {
|
|
161
|
+
if (lower.includes(name.toLowerCase())) {
|
|
162
|
+
return name;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return best;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ActionDefinition, PeerConfig } from '../types.js';
|
|
2
|
+
/** Action name for the built-in peer consultation action */
|
|
3
|
+
export declare const PEER_ACTION_NAME = "consultPeer";
|
|
4
|
+
/**
|
|
5
|
+
* Build the consultPeer action definition from the declared peer config.
|
|
6
|
+
* Auto-registered when peers are configured on withStorage() — same pattern as
|
|
7
|
+
* memory CRUD entities when memory is enabled.
|
|
8
|
+
*
|
|
9
|
+
* The description is generated from peer identities so the persona knows
|
|
10
|
+
* who it can consult and what each peer offers.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildPeerAction(peers: Record<string, PeerConfig>): Record<string, ActionDefinition>;
|
|
13
|
+
/** Set of built-in peer action names (for auto-handling in managed mode) */
|
|
14
|
+
export declare const PEER_ACTION_NAMES: Set<string>;
|
|
15
|
+
//# sourceMappingURL=peer-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-actions.d.ts","sourceRoot":"","sources":["../../src/core/peer-actions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE/D,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAE7C;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAmBnG;AAED,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,aAA8B,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Action name for the built-in peer consultation action */
|
|
3
|
+
export const PEER_ACTION_NAME = 'consultPeer';
|
|
4
|
+
/**
|
|
5
|
+
* Build the consultPeer action definition from the declared peer config.
|
|
6
|
+
* Auto-registered when peers are configured on withStorage() — same pattern as
|
|
7
|
+
* memory CRUD entities when memory is enabled.
|
|
8
|
+
*
|
|
9
|
+
* The description is generated from peer identities so the persona knows
|
|
10
|
+
* who it can consult and what each peer offers.
|
|
11
|
+
*/
|
|
12
|
+
export function buildPeerAction(peers) {
|
|
13
|
+
const peerNames = Object.keys(peers);
|
|
14
|
+
const peerDescriptions = peerNames
|
|
15
|
+
.map(name => {
|
|
16
|
+
const expertise = peers[name].expertise;
|
|
17
|
+
return expertise ? `${name} (${expertise})` : name;
|
|
18
|
+
})
|
|
19
|
+
.join(', ');
|
|
20
|
+
return {
|
|
21
|
+
[PEER_ACTION_NAME]: {
|
|
22
|
+
description: `Consult a peer for information or expertise you need to handle the current situation well. Available peers: ${peerDescriptions}. Be specific about what you need — the peer sees your query and curates a response.`,
|
|
23
|
+
schema: z.object({
|
|
24
|
+
peer: z.string().describe(`Which peer to consult: ${peerNames.join(' | ')}`),
|
|
25
|
+
query: z.string().describe('What you need from them — be specific about topics, senders, timeframes, or data types'),
|
|
26
|
+
}),
|
|
27
|
+
confidence: 'low', // consulting is always safe — no side effects
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Set of built-in peer action names (for auto-handling in managed mode) */
|
|
32
|
+
export const PEER_ACTION_NAMES = new Set([PEER_ACTION_NAME]);
|
|
33
|
+
//# sourceMappingURL=peer-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-actions.js","sourceRoot":"","sources":["../../src/core/peer-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAA;AAE7C;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,gBAAgB,GAAG,SAAS;SAC/B,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAA;QACvC,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACpD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;QACL,CAAC,gBAAgB,CAAC,EAAE;YAClB,WAAW,EAAE,+GAA+G,gBAAgB,sFAAsF;YAClO,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wFAAwF,CAAC;aACrH,CAAC;YACF,UAAU,EAAE,KAAK,EAAE,8CAA8C;SAClE;KACF,CAAA;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAA"}
|