@hunsu/protocol 0.1.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 (47) hide show
  1. package/LICENSE +157 -0
  2. package/dist/command-decoder.d.ts +5 -0
  3. package/dist/command-decoder.js +329 -0
  4. package/dist/constants.d.ts +15 -0
  5. package/dist/constants.js +15 -0
  6. package/dist/decoder-helpers.d.ts +58 -0
  7. package/dist/decoder-helpers.js +1757 -0
  8. package/dist/errors.d.ts +14 -0
  9. package/dist/errors.js +28 -0
  10. package/dist/event-decoder.d.ts +5 -0
  11. package/dist/event-decoder.js +232 -0
  12. package/dist/index.d.ts +10 -0
  13. package/dist/index.js +10 -0
  14. package/dist/lifecycle.d.ts +67 -0
  15. package/dist/lifecycle.js +271 -0
  16. package/dist/model.d.ts +1058 -0
  17. package/dist/model.js +1 -0
  18. package/dist/primitives.d.ts +59 -0
  19. package/dist/primitives.js +135 -0
  20. package/dist/projection.d.ts +8 -0
  21. package/dist/projection.js +875 -0
  22. package/dist/prompt-template.d.ts +12 -0
  23. package/dist/prompt-template.js +83 -0
  24. package/dist/protocol-validation.d.ts +36 -0
  25. package/dist/protocol-validation.js +1139 -0
  26. package/dist/result.d.ts +20 -0
  27. package/dist/result.js +21 -0
  28. package/dist/workflow-helpers.d.ts +31 -0
  29. package/dist/workflow-helpers.js +193 -0
  30. package/dist/workflow.d.ts +10 -0
  31. package/dist/workflow.js +594 -0
  32. package/package.json +30 -0
  33. package/src/command-decoder.ts +292 -0
  34. package/src/constants.ts +27 -0
  35. package/src/decoder-helpers.ts +1672 -0
  36. package/src/errors.ts +38 -0
  37. package/src/event-decoder.ts +225 -0
  38. package/src/index.ts +43 -0
  39. package/src/lifecycle.ts +403 -0
  40. package/src/model.ts +1233 -0
  41. package/src/primitives.ts +196 -0
  42. package/src/projection.ts +1081 -0
  43. package/src/prompt-template.ts +97 -0
  44. package/src/protocol-validation.ts +1252 -0
  45. package/src/result.ts +35 -0
  46. package/src/workflow-helpers.ts +239 -0
  47. package/src/workflow.ts +753 -0
@@ -0,0 +1,12 @@
1
+ import { type DomainWorkflowError } from "./errors.ts";
2
+ import { type Result } from "./result.ts";
3
+ export declare const PROMPT_TEMPLATE_ENGINE_V1: "hunsu-template-v1";
4
+ export type PromptTemplate = {
5
+ engine: typeof PROMPT_TEMPLATE_ENGINE_V1;
6
+ template: string;
7
+ };
8
+ export type PromptTemplateContext = Record<string, unknown>;
9
+ export declare function promptTemplateFromText(template: string): PromptTemplate;
10
+ export declare function decodePromptTemplate(value: unknown, path: string): Result<PromptTemplate, DomainWorkflowError>;
11
+ export declare function assertValidPromptTemplate(value: unknown, path: string): asserts value is PromptTemplate;
12
+ export declare function renderPromptTemplate(template: PromptTemplate, context: PromptTemplateContext): string;
@@ -0,0 +1,83 @@
1
+ import { DomainInvariantError, workflowError } from "./errors.js";
2
+ import { ok } from "./result.js";
3
+ export const PROMPT_TEMPLATE_ENGINE_V1 = "hunsu-template-v1";
4
+ export function promptTemplateFromText(template) {
5
+ return { engine: PROMPT_TEMPLATE_ENGINE_V1, template };
6
+ }
7
+ export function decodePromptTemplate(value, path) {
8
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
9
+ return workflowError(`${path} must be an object`);
10
+ }
11
+ const record = value;
12
+ const allowed = new Set(["engine", "template"]);
13
+ const unexpected = Object.keys(record).filter(key => !allowed.has(key));
14
+ if (unexpected.length > 0) {
15
+ return workflowError(`${path} has unsupported field: ${unexpected[0]}`);
16
+ }
17
+ if (!("engine" in record)) {
18
+ return workflowError(`${path}.engine is required`);
19
+ }
20
+ if (!("template" in record)) {
21
+ return workflowError(`${path}.template is required`);
22
+ }
23
+ if (record.engine !== PROMPT_TEMPLATE_ENGINE_V1) {
24
+ return workflowError(`${path}.engine must be ${PROMPT_TEMPLATE_ENGINE_V1}`);
25
+ }
26
+ if (typeof record.template !== "string") {
27
+ return workflowError(`${path}.template must be a string`);
28
+ }
29
+ return ok({ engine: PROMPT_TEMPLATE_ENGINE_V1, template: record.template });
30
+ }
31
+ export function assertValidPromptTemplate(value, path) {
32
+ const result = decodePromptTemplate(value, path);
33
+ if (!result.ok) {
34
+ throw new DomainInvariantError(result.error.message);
35
+ }
36
+ }
37
+ export function renderPromptTemplate(template, context) {
38
+ assertValidPromptTemplate(template, "promptTemplate");
39
+ return template.template.replace(/\{\{\s*([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\[[0-9]+\])*)\s*\}\}/g, (_match, expression) => {
40
+ const value = resolveTemplateExpression(context, expression);
41
+ if (value === undefined || value === null) {
42
+ throw new DomainInvariantError(`Prompt template value is unavailable: ${expression}`);
43
+ }
44
+ return formatTemplateValue(value);
45
+ });
46
+ }
47
+ function resolveTemplateExpression(context, expression) {
48
+ const tokens = expression.match(/[A-Za-z_$][\w$]*|\[[0-9]+\]/g);
49
+ if (!tokens || tokens.join("").replace(/\]\[/g, "][") === "") {
50
+ return undefined;
51
+ }
52
+ let current = context;
53
+ for (const token of tokens) {
54
+ if (token.startsWith("[")) {
55
+ const index = Number(token.slice(1, -1));
56
+ if (!Array.isArray(current)) {
57
+ return undefined;
58
+ }
59
+ current = current[index];
60
+ continue;
61
+ }
62
+ if (typeof current !== "object" || current === null) {
63
+ return undefined;
64
+ }
65
+ current = current[token];
66
+ }
67
+ return current;
68
+ }
69
+ function formatTemplateValue(value) {
70
+ if (typeof value === "string") {
71
+ return value;
72
+ }
73
+ if (typeof value === "number" || typeof value === "boolean") {
74
+ return String(value);
75
+ }
76
+ if (Array.isArray(value)) {
77
+ return value.map(formatTemplateValue).join("\n");
78
+ }
79
+ if (typeof value === "object" && value !== null) {
80
+ return JSON.stringify(value);
81
+ }
82
+ return "";
83
+ }
@@ -0,0 +1,36 @@
1
+ import { type DomainWorkflowError } from "./errors.ts";
2
+ import type { ExecutorEntity, Harness, HarnessPlannerSnapshot, HarnessSnapshot, ManagerConfig, Member, MemberApprovalConstraint, MemberConfig, MemberExecutionConstraint, MemberPluginBinding, SkillBinding } from "./model.ts";
3
+ import { type PromptTemplate } from "./prompt-template.ts";
4
+ import { type Result } from "./result.ts";
5
+ export declare const DEFAULT_TEAM_PROMPT = "Create a closure-free ExecutionPlan using the available Members.";
6
+ export declare const DEFAULT_MANAGER_PROMPT: string;
7
+ export declare const DEFAULT_MEMBER_EXECUTION: MemberExecutionConstraint;
8
+ export declare const DEFAULT_MEMBER_APPROVAL: MemberApprovalConstraint;
9
+ export declare function validateHarness(value: unknown): Result<HarnessSnapshot, DomainWorkflowError>;
10
+ export declare function validateHarnessPlanner(value: unknown): Result<HarnessPlannerSnapshot, DomainWorkflowError>;
11
+ export declare function validateHarnessEntity(value: unknown, path?: string): Result<Harness, DomainWorkflowError>;
12
+ export declare function validateMemberConfig(value: unknown, path?: string): Result<MemberConfig, DomainWorkflowError>;
13
+ export declare function validateManagerConfig(value: unknown, path?: string): Result<ManagerConfig, DomainWorkflowError>;
14
+ export declare function isExecutableHarness(protocol: HarnessSnapshot): boolean;
15
+ export declare function validateExecutableHarness(protocol: HarnessSnapshot): Result<HarnessSnapshot, DomainWorkflowError>;
16
+ export declare function createDefaultHarness(instructions?: string, skills?: SkillBinding[]): HarnessSnapshot;
17
+ export declare function createDefaultMemberConfig(id: string, prompt?: string, skills?: SkillBinding[], execution?: MemberExecutionConstraint, approval?: MemberApprovalConstraint, plugins?: MemberPluginBinding[]): MemberConfig;
18
+ export declare function createDefaultManagerConfig(id?: string, prompt?: string, skills?: SkillBinding[], plugins?: MemberPluginBinding[]): ManagerConfig;
19
+ export declare function cloneHarness(protocol: HarnessSnapshot): HarnessSnapshot;
20
+ export declare function cloneHarnessPlanner(protocol: HarnessPlannerSnapshot): HarnessPlannerSnapshot;
21
+ export declare function harnessPlannerFromSnapshot(protocol: HarnessSnapshot): HarnessPlannerSnapshot;
22
+ export declare function composeHarnessSnapshot(planner: HarnessPlannerSnapshot, members: MemberConfig[]): HarnessSnapshot;
23
+ export declare function harnessEntityFromSnapshot(protocol: HarnessSnapshot, rootTeamId?: string): Harness;
24
+ export declare function harnessSnapshotForTeam(harness: Harness, teamId?: string): HarnessSnapshot;
25
+ export declare function rootHarnessSnapshot(harness: Harness): HarnessSnapshot;
26
+ export declare function cloneHarnessEntity(harness: Harness): Harness;
27
+ export declare function getHarnessExecutor(harness: Harness, executorId: string): ExecutorEntity | undefined;
28
+ export declare function getHarnessTeam(harness: Harness, executorId: string): Extract<ExecutorEntity, {
29
+ kind: "team";
30
+ }> | undefined;
31
+ export declare function getHarnessMember(harness: Harness, executorId: string): Member | undefined;
32
+ export declare function memberConfigFromMemberEntity(member: Member): MemberConfig;
33
+ export declare function getHarnessMemberConfig(protocol: HarnessSnapshot, executorId: string): MemberConfig | undefined;
34
+ export declare function updateHarnessMemberConfig(protocol: HarnessSnapshot, executorId: string, update: (member: MemberConfig) => MemberConfig): HarnessSnapshot;
35
+ export declare function updateHarnessTeamPromptTemplate(protocol: HarnessSnapshot, promptTemplate: PromptTemplate): HarnessSnapshot;
36
+ export declare function validateSkillBinding(value: unknown, path: string): void;