@oneie/sdk 0.14.10 → 0.14.12
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/dist/fn-allowlist.d.ts +27 -0
- package/dist/fn-allowlist.d.ts.map +1 -0
- package/dist/fn-allowlist.js +51 -0
- package/dist/fn-allowlist.js.map +1 -0
- package/dist/generated/base-manifest.d.ts.map +1 -1
- package/dist/generated/base-manifest.js +25 -0
- package/dist/generated/base-manifest.js.map +1 -1
- package/dist/generated/fn-map.d.ts +2 -2
- package/dist/generated/fn-map.d.ts.map +1 -1
- package/dist/generated/fn-map.js +480 -13
- package/dist/generated/fn-map.js.map +1 -1
- package/dist/generated/schemas.d.ts +69 -0
- package/dist/generated/schemas.d.ts.map +1 -1
- package/dist/generated/schemas.js +29 -3
- package/dist/generated/schemas.js.map +1 -1
- package/dist/market.d.ts +2 -0
- package/dist/market.d.ts.map +1 -1
- package/dist/market.js +2 -0
- package/dist/market.js.map +1 -1
- package/dist/receivers.d.ts +288 -2
- package/dist/receivers.d.ts.map +1 -1
- package/dist/receivers.js +288 -9
- package/dist/receivers.js.map +1 -1
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +3 -1
- package/dist/templates.js.map +1 -1
- package/dist/work-contract-grammar.json +21 -0
- package/package.json +6 -2
package/dist/receivers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receivers.d.ts","sourceRoot":"","sources":["../src/receivers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB;;;;;;;;;;;;;GAaG;AAEH;sEACsE;AACtE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,+DAA+D;AAC/D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,oDAAoD;AACpD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEzD,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,QAAQ,CACvB,GAAG,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,EACvC,GAAG,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;IAEvC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,OAAO,EAAE,GAAG,CAAC;IACb,oCAAoC;IACpC,QAAQ,EAAE,GAAG,CAAC;IACd,gEAAgE;IAChE,MAAM,EAAE,cAAc,CAAC;IACvB,mEAAmE;IACnE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;2EACuE;IACvE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGnC,wDAAwD;IACxD,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE9B;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;CACrF;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,SAAS,CAAC,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC,UAAU,EACzE,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GACpB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAEpB;AAID;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"receivers.d.ts","sourceRoot":"","sources":["../src/receivers.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAikHc,CAAC;AAErC,sDAAsD;AACtD,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,SAAS,CAAC;AAElD,+CAA+C;AAC/C,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,YAAY,IACtC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEzF,iDAAiD;AACjD,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,YAAY,IACtC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE1F;;;;;GAKG;AACH,eAAO,MAAM,OAAO;IAClB,iFAAiF;;IAEjF,wDAAwD;;IAExD,iEAAiE;;IAEjE,mDAAmD;;IAEnD,8DAA8D;;IAE9D,wFAAwF;;CAEvC,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAC"}
|
package/dist/receivers.js
CHANGED
|
@@ -734,24 +734,49 @@ export const RECEIVERS = {
|
|
|
734
734
|
}),
|
|
735
735
|
"world:route": receiver({
|
|
736
736
|
receiver: "world:route",
|
|
737
|
-
summary: "Route a tagged signal to THE handler via the ladder: learned tag-node path (follow_route) → staked subscribers (reputation-ranked) → CEO standing workflow; marks the delivery path so the next route is smarter. reply:true also invokes the resolved actor and returns its answer inline",
|
|
737
|
+
summary: "Route a tagged signal to THE handler via the ladder: learned tag-node path (follow_route) → staked subscribers (reputation-ranked) → CEO standing workflow; marks the delivery path so the next route is smarter. reply:true also invokes the resolved actor and returns its answer inline. decide:true instead answers the deterministic verdict { receiver, rung, reason } (reason: highway|classified|ceo) from the learned lane — a pure read, zero side effects, zero tokens; TypeQL twin: route_verdict (migration 0043)",
|
|
738
738
|
request: z.object({
|
|
739
739
|
tags: z.array(z.string()),
|
|
740
|
+
decide: z.boolean().optional(), // true → verdict-only: no delivery, no mark, no CEO trigger
|
|
740
741
|
deliver: z.boolean().optional(),
|
|
741
742
|
reply: z.boolean().optional(),
|
|
742
743
|
board: z.literal("marketplace").optional(),
|
|
743
744
|
slug: z.string().optional(),
|
|
744
745
|
workspace: z.string().optional(),
|
|
745
|
-
}).catchall(z.unknown()), // extra keys = the message payload (e.g. content) — carried through to the resolved actor, never stripped
|
|
746
|
+
}).catchall(z.unknown()), // extra keys = the message payload (e.g. content, text) — carried through to the resolved actor, never stripped
|
|
746
747
|
response: z.object({
|
|
747
748
|
ok: z.boolean(),
|
|
748
749
|
routed: z.enum(["learned", "staked", "explore", "ceo"]).optional(),
|
|
749
750
|
actor: z.string().optional(),
|
|
751
|
+
// decide:true verdict fields — receiver null ⇔ reason 'ceo'; rung 1:1 with reason (highway→1 classified→2 ceo→3)
|
|
752
|
+
receiver: z.string().nullable().optional(),
|
|
753
|
+
rung: z.number().optional(),
|
|
754
|
+
reason: z.enum(["highway", "classified", "ceo"]).optional(),
|
|
750
755
|
tags: z.array(z.string()).optional(),
|
|
751
756
|
reply: z.object({ ok: z.boolean(), text: z.string().optional(), error: z.string().optional() }).optional(),
|
|
752
757
|
}),
|
|
753
758
|
effect: "ask",
|
|
754
759
|
}),
|
|
760
|
+
"world:suggest-workflow": receiver({
|
|
761
|
+
receiver: "world:suggest-workflow",
|
|
762
|
+
summary: "Rank staked workflows by tag match + earned track record (claw_paths), read-only — no delivery, no run, no auto-trigger. Requires >=3 successful runs before a workflow is surfaced; caps at 3 suggestions",
|
|
763
|
+
request: z.object({
|
|
764
|
+
tags: z.array(z.string()),
|
|
765
|
+
workspace: z.string().optional(),
|
|
766
|
+
slug: z.string().optional(),
|
|
767
|
+
}).catchall(z.unknown()),
|
|
768
|
+
response: z.object({
|
|
769
|
+
ok: z.boolean(),
|
|
770
|
+
suggestions: z.array(z.object({
|
|
771
|
+
workflowId: z.string(),
|
|
772
|
+
name: z.string(),
|
|
773
|
+
weight: z.number(),
|
|
774
|
+
tags: z.array(z.string()),
|
|
775
|
+
})).optional(),
|
|
776
|
+
error: z.string().optional(),
|
|
777
|
+
}),
|
|
778
|
+
effect: "ask", idempotent: true,
|
|
779
|
+
}),
|
|
755
780
|
"tasks:announce": receiver({
|
|
756
781
|
receiver: "tasks:announce",
|
|
757
782
|
summary: "Announce a task into the world by its tags — the first caller of world:announce",
|
|
@@ -768,7 +793,17 @@ export const RECEIVERS = {
|
|
|
768
793
|
"tasks:mine": receiver({
|
|
769
794
|
receiver: "tasks:mine",
|
|
770
795
|
summary: "My work queue: the open tasks whose words match what I subscribed to, ranked by learned weight (context-strength), not static priority",
|
|
771
|
-
|
|
796
|
+
// `workspace` is not decoration — /api/ask reads a SERVICE caller's nominated slug off
|
|
797
|
+
// validation.payload.slug|workspace, and zod .object() STRIPS unknown keys. Omitting the
|
|
798
|
+
// field here meant a service call could never name a workspace: ctx.ownerSlug stayed
|
|
799
|
+
// empty and the resolver answered "forbidden: authentication required" no matter which
|
|
800
|
+
// key was presented. A session-authenticated browser call was unaffected (locals.slug
|
|
801
|
+
// supplies the workspace), which is why this only ever failed for the harness.
|
|
802
|
+
request: z.object({
|
|
803
|
+
limit: z.number().optional(),
|
|
804
|
+
workspace: z.string().optional(),
|
|
805
|
+
slug: z.string().optional(),
|
|
806
|
+
}),
|
|
772
807
|
response: z.object({
|
|
773
808
|
ok: z.boolean(),
|
|
774
809
|
tasks: z.array(z.object({
|
|
@@ -788,7 +823,14 @@ export const RECEIVERS = {
|
|
|
788
823
|
"tasks:everywhere": receiver({
|
|
789
824
|
receiver: "tasks:everywhere",
|
|
790
825
|
summary: "Every workspace I belong to, one queue: open+picked tasks visible by assignment/follow/ownership, with claimable + mine + offeredByMe flags; closed:true returns the logbook (done/verified, newest first)",
|
|
791
|
-
|
|
826
|
+
// See tasks:mine — a service caller nominates its workspace here, and zod strips any
|
|
827
|
+
// field the schema does not declare.
|
|
828
|
+
request: z.object({
|
|
829
|
+
limit: z.number().optional(),
|
|
830
|
+
closed: z.boolean().optional(),
|
|
831
|
+
workspace: z.string().optional(),
|
|
832
|
+
slug: z.string().optional(),
|
|
833
|
+
}),
|
|
792
834
|
response: z.object({
|
|
793
835
|
ok: z.boolean(),
|
|
794
836
|
tasks: z.array(z.object({
|
|
@@ -810,6 +852,105 @@ export const RECEIVERS = {
|
|
|
810
852
|
}),
|
|
811
853
|
effect: "ask", idempotent: true,
|
|
812
854
|
}),
|
|
855
|
+
"factory:elaborate": receiver({
|
|
856
|
+
receiver: "factory:elaborate",
|
|
857
|
+
summary: "Create one rung of the derivation ladder (objective | deliverable | task) and hang it under its parent with containment — the ELABORATE move. The rung id is derived from slug + ordinal, so a retry dedupes instead of duplicating",
|
|
858
|
+
request: z.object({
|
|
859
|
+
type: z.enum(["objective", "deliverable", "task"]),
|
|
860
|
+
// The promise/plan slug the rung belongs to, and its ordinal within that slug.
|
|
861
|
+
// Both required: together they derive the rung id (Interface Contract #1,
|
|
862
|
+
// text/factory-todo.md) and the `rung:<type>:<slug>:<ordinal>` idempotency tag.
|
|
863
|
+
slug: z.string(),
|
|
864
|
+
ordinal: z.number(),
|
|
865
|
+
name: z.string(),
|
|
866
|
+
// The rung above — its containment container. Must live in the same resolved
|
|
867
|
+
// workspace; a parent the caller cannot see is refused, never silently skipped.
|
|
868
|
+
parent: z.string().optional(),
|
|
869
|
+
// The machine-observable accept: check for this rung (factory-plan.md §7.3).
|
|
870
|
+
exitCondition: z.string().optional(),
|
|
871
|
+
notes: z.string().optional(),
|
|
872
|
+
tags: z.array(z.string()).optional(),
|
|
873
|
+
// Same authorization contract as tasks:create's workspace — honored only for an
|
|
874
|
+
// authorized caller, otherwise it falls back to the caller's own slug.
|
|
875
|
+
workspace: z.string().optional(),
|
|
876
|
+
}),
|
|
877
|
+
response: z.object({
|
|
878
|
+
ok: z.boolean(),
|
|
879
|
+
tid: z.string().optional(),
|
|
880
|
+
type: z.string().optional(),
|
|
881
|
+
parent: z.string().nullable().optional(),
|
|
882
|
+
tags: z.array(z.string()).optional(),
|
|
883
|
+
deduped: z.boolean().optional(),
|
|
884
|
+
error: z.string().optional(),
|
|
885
|
+
}),
|
|
886
|
+
effect: "ask", idempotent: true,
|
|
887
|
+
}),
|
|
888
|
+
"factory:attempt": receiver({
|
|
889
|
+
receiver: "factory:attempt",
|
|
890
|
+
summary: "Open an attempt contained by its task, or close it with the production edge to what it produced plus the rubric. A do-cycle IS an attempt (factory-plan.md §3.1) — do:cycle-close arms as a caller of the close phase, never as a second writer",
|
|
891
|
+
request: z.object({
|
|
892
|
+
phase: z.enum(["open", "close"]),
|
|
893
|
+
// open
|
|
894
|
+
task: z.string().optional(),
|
|
895
|
+
ordinal: z.number().optional(),
|
|
896
|
+
// Which actor ran it — provenance (path attempt → actor), never authority.
|
|
897
|
+
actorId: z.string().optional(),
|
|
898
|
+
tags: z.array(z.string()).optional(),
|
|
899
|
+
// close
|
|
900
|
+
attempt: z.string().optional(),
|
|
901
|
+
status: z.enum(["done", "verified", "failed", "dissolved"]).optional(),
|
|
902
|
+
produced: z.string().optional(),
|
|
903
|
+
// Scores land on the ATTEMPT — the graph is the authority; a composite on the
|
|
904
|
+
// plan thing is a cached projection over the attempts it contains (§3.2).
|
|
905
|
+
rubric: z.object({
|
|
906
|
+
composite: z.number().optional(),
|
|
907
|
+
security: z.number().optional(),
|
|
908
|
+
stability: z.number().optional(),
|
|
909
|
+
simplicity: z.number().optional(),
|
|
910
|
+
speed: z.number().optional(),
|
|
911
|
+
}).optional(),
|
|
912
|
+
workspace: z.string().optional(),
|
|
913
|
+
}),
|
|
914
|
+
response: z.object({
|
|
915
|
+
ok: z.boolean(),
|
|
916
|
+
tid: z.string().optional(),
|
|
917
|
+
task: z.string().optional(),
|
|
918
|
+
phase: z.string().optional(),
|
|
919
|
+
status: z.string().optional(),
|
|
920
|
+
produced: z.string().nullable().optional(),
|
|
921
|
+
rubric: z.array(z.string()).optional(),
|
|
922
|
+
deduped: z.boolean().optional(),
|
|
923
|
+
error: z.string().optional(),
|
|
924
|
+
}),
|
|
925
|
+
effect: "ask", idempotent: true,
|
|
926
|
+
}),
|
|
927
|
+
"do:halt": receiver({
|
|
928
|
+
receiver: "do:halt",
|
|
929
|
+
summary: "Stop a factory run, or release the stop. Sets a halt latch on the plan thing that `factory:attempt` phase \"open\" refuses against, so no new attempt can be claimed; with `attempt`, also closes that in-flight attempt as dissolved. It does NOT kill an OS process — a cycle already executing stops at its next substrate write",
|
|
930
|
+
request: z.object({
|
|
931
|
+
// The plan slug the operator sees ("factory"). The plan tid is resolved server-side;
|
|
932
|
+
// a tid from the body would be an addressable another tenant could guess.
|
|
933
|
+
slug: z.string(),
|
|
934
|
+
// Lift the latch instead of setting it. A stop with no release bricks the only
|
|
935
|
+
// write path the ladder has.
|
|
936
|
+
release: z.boolean().optional(),
|
|
937
|
+
// Optionally dissolve one in-flight attempt in the same act.
|
|
938
|
+
attempt: z.string().optional(),
|
|
939
|
+
// Same authorization contract as factory:elaborate's workspace — honored only for
|
|
940
|
+
// an authorized caller, otherwise it resolves back to the caller's own slug.
|
|
941
|
+
workspace: z.string().optional(),
|
|
942
|
+
}),
|
|
943
|
+
response: z.object({
|
|
944
|
+
ok: z.boolean(),
|
|
945
|
+
tid: z.string().optional(),
|
|
946
|
+
slug: z.string().optional(),
|
|
947
|
+
halted: z.boolean().optional(),
|
|
948
|
+
attempt: z.string().nullable().optional(),
|
|
949
|
+
deduped: z.boolean().optional(),
|
|
950
|
+
error: z.string().optional(),
|
|
951
|
+
}),
|
|
952
|
+
effect: "ask", idempotent: true,
|
|
953
|
+
}),
|
|
813
954
|
"tasks:create": receiver({
|
|
814
955
|
receiver: "tasks:create",
|
|
815
956
|
summary: "Write one open task to the substrate and announce it by its tags in the same act — the quick-add entry point",
|
|
@@ -831,11 +972,21 @@ export const RECEIVERS = {
|
|
|
831
972
|
}),
|
|
832
973
|
"tasks:claim": receiver({
|
|
833
974
|
receiver: "tasks:claim",
|
|
834
|
-
summary: "Take a task off the queue: blocker-gate → status picked → tag the claimant @<slug>. The claimant is the attested caller, never a body field",
|
|
975
|
+
summary: "Take a task off the queue: blocker-gate → status picked → tag the claimant @<slug>. Address it by tid, or by the /do slug the task was created under. The claimant is the attested caller, never a body field",
|
|
976
|
+
// Addressable two ways, and BOTH must be optional here. The resolver has always
|
|
977
|
+
// supported slug (resolveTaskBySlug) because create returns a random task:<traceId>
|
|
978
|
+
// that no caller can derive — but this schema required `tid`, so every slug-addressed
|
|
979
|
+
// claim (do-signal.sh --task-claim, do-fleet.sh's lease) was rejected at validation
|
|
980
|
+
// before the resolver ran. The contract, not the resolver, was the dead wire.
|
|
835
981
|
request: z.object({
|
|
836
|
-
tid: z.string(),
|
|
982
|
+
tid: z.string().optional(),
|
|
983
|
+
// The kebab /do slug the task carries as a `slug:` tag.
|
|
984
|
+
slug: z.string().optional(),
|
|
837
985
|
// Viewed workspace — same authorization contract as tasks:create's workspace.
|
|
838
986
|
workspace: z.string().optional(),
|
|
987
|
+
}).refine((v) => !!v.tid || !!v.slug, {
|
|
988
|
+
message: "address the task by tid or slug",
|
|
989
|
+
path: ["tid"],
|
|
839
990
|
}),
|
|
840
991
|
response: z.object({
|
|
841
992
|
ok: z.boolean().optional(),
|
|
@@ -883,8 +1034,12 @@ export const RECEIVERS = {
|
|
|
883
1034
|
"tasks:link": receiver({
|
|
884
1035
|
receiver: "tasks:link",
|
|
885
1036
|
summary: "Close the handoff: record that a claimed task was built via /do <slug> — append a provenance line to the task's notes (the id back-ref + doc stems) and move it to done. Auth: attested caller only",
|
|
1037
|
+
// The slug IS the handle here — the resolver requires it and resolves the origin tid
|
|
1038
|
+
// from the `slug:` tag, treating an explicit tid as an optional override for direct
|
|
1039
|
+
// callers. Requiring tid (as this did) rejected every /do close, which knows the plan
|
|
1040
|
+
// slug and never the generated task:<traceId>.
|
|
886
1041
|
request: z.object({
|
|
887
|
-
tid: z.string(),
|
|
1042
|
+
tid: z.string().optional(),
|
|
888
1043
|
// The kebab /do slug the task was built into (the docs backfilled under text/<slug>*).
|
|
889
1044
|
slug: z.string(),
|
|
890
1045
|
// Doc stems the /do run produced (e.g. ["usage-billing", "usage-billing-plan"]).
|
|
@@ -979,6 +1134,8 @@ export const RECEIVERS = {
|
|
|
979
1134
|
price: z.number().nonnegative(),
|
|
980
1135
|
currency: z.string().default("credits"),
|
|
981
1136
|
deadline: z.string().datetime(),
|
|
1137
|
+
pid: z.string().optional(),
|
|
1138
|
+
ppid: z.string().optional(),
|
|
982
1139
|
}),
|
|
983
1140
|
response: z.union([
|
|
984
1141
|
z.object({ ok: z.literal(true), deal: z.object({ id: z.string(), stage: z.string(), version: z.number() }) }),
|
|
@@ -1077,6 +1234,20 @@ export const RECEIVERS = {
|
|
|
1077
1234
|
]),
|
|
1078
1235
|
effect: "ask", auth: "required", reversible: false, idempotent: false,
|
|
1079
1236
|
}),
|
|
1237
|
+
"market:offers": receiver({
|
|
1238
|
+
receiver: "market:offers",
|
|
1239
|
+
summary: "List the caller's own deals (as buyer or seller), optionally filtered by stage",
|
|
1240
|
+
request: z.object({ stage: z.string().optional() }),
|
|
1241
|
+
response: z.union([
|
|
1242
|
+
z.object({ ok: z.literal(true), deals: z.array(z.object({
|
|
1243
|
+
id: z.string(), buyer: z.string(), seller: z.string(), skill: z.string(),
|
|
1244
|
+
price: z.number(), currency: z.string(), stage: z.string(), version: z.number(),
|
|
1245
|
+
pid: z.string().optional(), ppid: z.string().optional(),
|
|
1246
|
+
})) }),
|
|
1247
|
+
z.object({ ok: z.literal(false), error: z.string() }),
|
|
1248
|
+
]),
|
|
1249
|
+
effect: "ask", auth: "required", cost: "free", idempotent: true,
|
|
1250
|
+
}),
|
|
1080
1251
|
// ── market (TRADE) ──
|
|
1081
1252
|
"market:hire": receiver({
|
|
1082
1253
|
receiver: "market:hire",
|
|
@@ -1911,6 +2082,76 @@ export const RECEIVERS = {
|
|
|
1911
2082
|
response: z.object({ ok: z.boolean(), slug: z.string().optional(), title: z.string().optional(), url: z.string().optional(), status: z.string().optional(), error: z.string().optional() }),
|
|
1912
2083
|
effect: "ask", cost: "free", reversible: true, idempotent: true, auth: "member",
|
|
1913
2084
|
}),
|
|
2085
|
+
'pages:publish-pack': receiver({
|
|
2086
|
+
receiver: "pages:publish-pack",
|
|
2087
|
+
summary: "Publish all (or a listed subset of) a workspace's draft pack pages in one call — the go-live step. Reuses pages:publish's exact UPDATE, looped once, gated once.",
|
|
2088
|
+
request: z.object({ slug: z.string(), pages: z.array(z.union([z.string(), z.object({ slug: z.string() })])).optional() }),
|
|
2089
|
+
response: z.object({ ok: z.boolean(), published: z.number().optional(), error: z.string().optional() }),
|
|
2090
|
+
effect: "ask", cost: "free", reversible: true, idempotent: true, auth: "member",
|
|
2091
|
+
}),
|
|
2092
|
+
"pages:fill-pack": receiver({
|
|
2093
|
+
receiver: "pages:fill-pack",
|
|
2094
|
+
summary: "Fill a pack's instantiated pages with real business facts — one call, still drafts. Never fabricates a testimonial; pricing derives from one rate, not typed per page.",
|
|
2095
|
+
request: z.object({
|
|
2096
|
+
slug: z.string(),
|
|
2097
|
+
pages: z.array(z.object({ pageSlug: z.string(), slug: z.string() })),
|
|
2098
|
+
facts: z.object({
|
|
2099
|
+
identity: z.object({
|
|
2100
|
+
company: z.string(),
|
|
2101
|
+
ownerName: z.string(),
|
|
2102
|
+
phone: z.string(),
|
|
2103
|
+
foundedYear: z.number(),
|
|
2104
|
+
city: z.string(),
|
|
2105
|
+
state: z.string(),
|
|
2106
|
+
metro: z.string(),
|
|
2107
|
+
streetAddress: z.string(),
|
|
2108
|
+
}),
|
|
2109
|
+
licensing: z.object({
|
|
2110
|
+
usdot: z.string().optional(),
|
|
2111
|
+
mc: z.string().optional(),
|
|
2112
|
+
stateLicenseNumber: z.string(),
|
|
2113
|
+
regulatorOverride: z.string().optional(),
|
|
2114
|
+
}),
|
|
2115
|
+
reputation: z.object({ starRating: z.number(), reviewCount: z.number(), movesCompleted: z.number() }),
|
|
2116
|
+
serviceArea: z.object({ neighborhoods: z.array(z.string()).min(1) }),
|
|
2117
|
+
pricing: z.object({
|
|
2118
|
+
hourlyRatePerMover: z.number(),
|
|
2119
|
+
truckFee: z.number(),
|
|
2120
|
+
tiers: z.record(z.string(), z.object({ low: z.number(), high: z.number() })).optional(),
|
|
2121
|
+
}),
|
|
2122
|
+
story: z.object({ originSentence: z.string().optional() }).optional(),
|
|
2123
|
+
testimonials: z.array(z.object({ quote: z.string(), reviewerName: z.string(), moveType: z.string() })).optional(),
|
|
2124
|
+
source: z.object({ url: z.string().optional() }).optional(),
|
|
2125
|
+
}),
|
|
2126
|
+
}),
|
|
2127
|
+
response: z.object({ ok: z.boolean(), filled: z.number().optional(), error: z.string().optional() }),
|
|
2128
|
+
effect: "ask", cost: "free", reversible: true, idempotent: false, auth: "member",
|
|
2129
|
+
}),
|
|
2130
|
+
"pages:fill-pack-extract": receiver({
|
|
2131
|
+
receiver: "pages:fill-pack-extract",
|
|
2132
|
+
summary: "Best-effort business facts from an operator's own URL or a free-text description — fetch-then-confirm, never fetch-then-apply. Returns candidate facts for a form to pre-fill; nothing here writes a page.",
|
|
2133
|
+
request: z.object({ slug: z.string(), url: z.string().optional(), text: z.string().optional() }),
|
|
2134
|
+
response: z.object({ ok: z.boolean(), facts: z.record(z.string(), z.unknown()).optional(), error: z.string().optional() }),
|
|
2135
|
+
effect: "ask", cost: "variable", reversible: true, idempotent: true, auth: "member",
|
|
2136
|
+
}),
|
|
2137
|
+
"movers:build": receiver({
|
|
2138
|
+
receiver: "movers:build",
|
|
2139
|
+
summary: "The one intake orchestrator — takes a URL or a free-text description, extracts MoverBusinessFacts, clones the movers-factory template, and starts the run. The single op every door (web form, chat) shares; composes pages:fill-pack-extract + workflow:create + workflow:run, adds no new build primitive.",
|
|
2140
|
+
request: z.object({ slug: z.string(), url: z.string().optional(), describe: z.string().optional() }),
|
|
2141
|
+
response: z.object({ ok: z.boolean(), runId: z.string().optional(), facts: z.record(z.string(), z.unknown()).optional(), error: z.string().optional() }),
|
|
2142
|
+
effect: "ask", cost: "variable", reversible: false, idempotent: false, auth: "member",
|
|
2143
|
+
examples: [{ slug: "summit-movers", describe: "We're Summit Movers, family-run in Austin since 2015, licensed CAL-T, $65/hr per mover." }],
|
|
2144
|
+
surfaces: { chat: true },
|
|
2145
|
+
}),
|
|
2146
|
+
"movers:funnel-provision": receiver({
|
|
2147
|
+
receiver: "movers:funnel-provision",
|
|
2148
|
+
summary: "Open, sponsored no-account provision — takes a company name plus a URL or description, provisions a capped child workspace under moverchat, and starts movers:build. Rate-limited per visitor + a global daily ceiling; refuses past any wall rather than draining moverchat's operating credits. The single writer behind both the homepage door and this chat tool.",
|
|
2149
|
+
request: z.object({ name: z.string(), url: z.string().optional(), describe: z.string().optional(), phone: z.string().optional(), email: z.string().optional(), visitorHash: z.string() }),
|
|
2150
|
+
response: z.object({ ok: z.boolean(), previewToken: z.string().optional(), slug: z.string().optional(), error: z.string().optional() }),
|
|
2151
|
+
effect: "ask", cost: "variable", reversible: false, idempotent: false, auth: "public",
|
|
2152
|
+
examples: [{ name: "Summit Movers", url: "https://summitmovers.example.com", visitorHash: "chat:web:conv-123" }],
|
|
2153
|
+
surfaces: { chat: true },
|
|
2154
|
+
}),
|
|
1914
2155
|
"pages:versions": receiver({
|
|
1915
2156
|
receiver: "pages:versions",
|
|
1916
2157
|
summary: "List a page's saved version snapshots, newest first",
|
|
@@ -1925,6 +2166,13 @@ export const RECEIVERS = {
|
|
|
1925
2166
|
response: z.object({ ok: z.boolean(), slug: z.string().optional(), title: z.string().optional(), url: z.string().optional(), status: z.string().optional(), restoredTs: z.number().optional(), error: z.string().optional() }),
|
|
1926
2167
|
effect: "ask", cost: "free", reversible: false, idempotent: false, auth: "member",
|
|
1927
2168
|
}),
|
|
2169
|
+
"mover:agent-context": receiver({
|
|
2170
|
+
receiver: "mover:agent-context",
|
|
2171
|
+
summary: "The fact→agent bridge — render MoverBusinessFacts into ground-truth prose and write it to the workspace's company_context, so the mounted chat agent answers as the operator's real business. Never invents a service/review/policy; same facts as pages:fill-pack, one intake, two artifacts.",
|
|
2172
|
+
request: z.object({ slug: z.string(), facts: z.record(z.string(), z.unknown()) }),
|
|
2173
|
+
response: z.object({ ok: z.boolean(), chars: z.number().optional(), error: z.string().optional() }),
|
|
2174
|
+
effect: "ask", cost: "free", reversible: true, idempotent: true, auth: "member",
|
|
2175
|
+
}),
|
|
1928
2176
|
"settings:write": receiver({
|
|
1929
2177
|
receiver: "settings:write",
|
|
1930
2178
|
summary: "Write a workspace setting value (caller or authorized descendant)",
|
|
@@ -2088,7 +2336,7 @@ export const RECEIVERS = {
|
|
|
2088
2336
|
slug: z.string(), // provider workspace
|
|
2089
2337
|
service: z.string().optional(), // service_id; omitted → the workspace's first active
|
|
2090
2338
|
date: z.string().optional(), // 'YYYY-MM-DD'; omitted → next N open days
|
|
2091
|
-
days: z.number().int().min(1).max(
|
|
2339
|
+
days: z.number().int().min(1).max(62).optional(), // window size when date omitted (month calendar needs ~2 months)
|
|
2092
2340
|
}),
|
|
2093
2341
|
response: z.object({
|
|
2094
2342
|
service: z.object({
|
|
@@ -2387,13 +2635,31 @@ export const RECEIVERS = {
|
|
|
2387
2635
|
response: z.object({
|
|
2388
2636
|
ok: z.boolean(),
|
|
2389
2637
|
stepCount: z.number().optional(),
|
|
2638
|
+
warnings: z.array(z.string()).optional(), // §9 advisories (never block); grammar: code | code:stepId
|
|
2390
2639
|
idMap: z.record(z.string(), z.string()).optional(), // tempId → persisted id
|
|
2391
|
-
error: z.string().optional(), // 'cycle_detected' | 'conflict' | 'invalid_diff'
|
|
2640
|
+
error: z.string().optional(), // 'cycle_detected' | 'conflict' | 'invalid_diff' | 'multiple_triggers' | 'edge_unknown_step' | 'invalid_config' | 'bad_expr' | 'unsupported_field'
|
|
2392
2641
|
}),
|
|
2393
2642
|
effect: "ask", cost: "free", reversible: true, idempotent: false, simulatable: true,
|
|
2394
2643
|
auth: "manage_workflows",
|
|
2395
2644
|
examples: [{ workflowId: "wf_abc", diff: { add: [{ tempId: "s1", kind: "trigger", name: "On signup", config: "{}" }] }, simulate: true }],
|
|
2396
2645
|
}),
|
|
2646
|
+
"workflow:validate": receiver({
|
|
2647
|
+
receiver: "workflow:validate",
|
|
2648
|
+
summary: "Run the §9 gate on a WorkflowDiff without persisting — kinds/config shapes, exactly-one-trigger, edges reference real steps, chain cycles; advisories ride back as warnings (grammar: code | code:stepId, never block). Every save door calls this.",
|
|
2649
|
+
request: z.object({
|
|
2650
|
+
workflowId: z.string(),
|
|
2651
|
+
diff: WorkflowDiffSchema,
|
|
2652
|
+
}),
|
|
2653
|
+
response: z.object({
|
|
2654
|
+
ok: z.boolean(),
|
|
2655
|
+
stepCount: z.number().optional(),
|
|
2656
|
+
warnings: z.array(z.string()).optional(),
|
|
2657
|
+
error: z.string().optional(), // 'multiple_triggers'|'edge_unknown_step'|'invalid_config'|'bad_expr'|'cycle_detected'|'invalid_diff'|'unsupported_field'
|
|
2658
|
+
}),
|
|
2659
|
+
effect: "ask", cost: "free", reversible: true, idempotent: true, simulatable: true,
|
|
2660
|
+
auth: "manage_workflows",
|
|
2661
|
+
examples: [{ workflowId: "wf_abc", diff: { add: [{ tempId: "s1", kind: "trigger", name: "On signup", config: "{}" }] } }],
|
|
2662
|
+
}),
|
|
2397
2663
|
"workflow:run": receiver({
|
|
2398
2664
|
receiver: "workflow:run",
|
|
2399
2665
|
summary: "Start a run — spawns the WorkflowRun DO, executes each step, marks path strength on traversed edges",
|
|
@@ -2497,6 +2763,19 @@ export const RECEIVERS = {
|
|
|
2497
2763
|
effect: "signal", cost: "free", idempotent: true, simulatable: false, auth: "manage_workflows",
|
|
2498
2764
|
examples: [{ runId: "run_1", stepId: "s2", stepName: "Approve contract" }],
|
|
2499
2765
|
}),
|
|
2766
|
+
"workflow:settled-notify": receiver({
|
|
2767
|
+
receiver: "workflow:settled-notify",
|
|
2768
|
+
summary: "Tell a run's started_by that it finished when there is no chat conversation to carry the outcome (manual/canvas/scheduled runs). settle() fires this group-less terminal only; a plain status line, never approval markup. Sibling of workflow:resumed-notify.",
|
|
2769
|
+
request: z.object({
|
|
2770
|
+
runId: z.string(),
|
|
2771
|
+
group: z.string(), // started_by — the workspace to notify
|
|
2772
|
+
status: z.string().optional(), // 'done' | 'failed'
|
|
2773
|
+
workflowName: z.string().optional(),
|
|
2774
|
+
}),
|
|
2775
|
+
response: z.object({ ok: z.boolean(), group: z.string().optional(), error: z.string().optional() }),
|
|
2776
|
+
effect: "signal", cost: "free", idempotent: true, simulatable: false, auth: "manage_workflows",
|
|
2777
|
+
examples: [{ runId: "run_1", group: "acme", status: "done" }],
|
|
2778
|
+
}),
|
|
2500
2779
|
"workflow:stop": receiver({
|
|
2501
2780
|
receiver: "workflow:stop",
|
|
2502
2781
|
summary: "Park a live run at its current step (status → paused); preserves the resume cursor so human:resolve or a re-run continues it",
|