@zhushanwen/extension-protocol 0.20.0 → 0.22.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.
package/dist/index.js CHANGED
@@ -794,23 +794,349 @@ var SUBAGENT_DIRECTIVE_CUSTOM_TYPE = "subagent-directive";
794
794
  // src/extensions/subagent-engine/contract.ts
795
795
  var SUBAGENTS_ENGINES_FILENAME = "engines.json";
796
796
 
797
+ // src/extensions/canvas/marker.ts
798
+ var CANVAS_MARKER = "\0TAIJI_CANVAS";
799
+ var CANVAS_ACTIONS = [
800
+ "create",
801
+ "grow",
802
+ "patch",
803
+ "decide-direction",
804
+ "select",
805
+ "transition",
806
+ "comment",
807
+ "comment-respond",
808
+ "review-request",
809
+ "review-append",
810
+ "review-resolve",
811
+ "converge-check",
812
+ "export",
813
+ "dispatch",
814
+ "read",
815
+ "list"
816
+ ];
817
+ var CANVAS_MARKER_ACTIONS = [...CANVAS_ACTIONS, "enter"];
818
+
819
+ // src/extensions/canvas/actions.ts
820
+ function isRecord4(v) {
821
+ return typeof v === "object" && v !== null && !Array.isArray(v);
822
+ }
823
+ function isOptionalString3(v) {
824
+ return v === void 0 || typeof v === "string";
825
+ }
826
+ function isStringArray2(v) {
827
+ return Array.isArray(v) && v.every((x) => typeof x === "string");
828
+ }
829
+ function isOptionalStringArray(v) {
830
+ return v === void 0 || isStringArray2(v);
831
+ }
832
+ function isOptionalBoolean(v) {
833
+ return v === void 0 || typeof v === "boolean";
834
+ }
835
+ function isStringIn(set, v) {
836
+ return typeof v === "string" && set.includes(v);
837
+ }
838
+ function isOptionalGuarded(guard, v) {
839
+ return v === void 0 || guard(v);
840
+ }
841
+ function isStringField(v, key) {
842
+ return typeof v[key] === "string";
843
+ }
844
+ function requireCanvasId(v) {
845
+ return isStringField(v, "canvasId");
846
+ }
847
+ function isCanvasCreateParams(v) {
848
+ return isRecord4(v) && isOptionalString3(v.name) && typeof v.statement === "string" && isStringArray2(v.criterias) && isStringArray2(v.scopeExclusions);
849
+ }
850
+ var CANVAS_NODE_TYPES = ["question", "option", "argument", "constraint"];
851
+ var CANVAS_EDGE_TYPES = ["decompose", "resolve", "argue", "rebut"];
852
+ var ARGUMENT_POLARITIES = ["support", "object"];
853
+ function isCanvasGrowItem(v) {
854
+ return isRecord4(v) && isStringField(v, "id") && isStringIn(CANVAS_NODE_TYPES, v.type) && isStringField(v, "content") && isStringField(v, "attachTo") && isStringIn(CANVAS_EDGE_TYPES, v.edge) && isOptionalGuarded(isArgumentPolarity, v.edgePolarity) && isOptionalGuarded(isArgumentMateriality, v.materiality) && isOptionalBoolean(v.factVerified) && isOptionalBoolean(v.dispatchable);
855
+ }
856
+ function isCanvasGrowParams(v) {
857
+ return isRecord4(v) && requireCanvasId(v) && Array.isArray(v.batch) && v.batch.every((item) => isCanvasGrowItem(item)) && typeof v.reason === "string";
858
+ }
859
+ function isCanvasPatchParams(v) {
860
+ return isRecord4(v) && requireCanvasId(v) && isStringField(v, "nodeId") && isOptionalString3(v.content) && isOptionalStringArray(v.criterias) && isOptionalBoolean(v.dispatchable) && isOptionalBoolean(v.factVerified) && typeof v.reason === "string";
861
+ }
862
+ function isCanvasDecideDirectionParams(v) {
863
+ return isRecord4(v) && requireCanvasId(v) && isStringIn(["top-down", "bottom-up"], v.direction) && typeof v.reason === "string";
864
+ }
865
+ function isCanvasSelectParams(v) {
866
+ if (!(isRecord4(v) && requireCanvasId(v) && isStringField(v, "questionId") && isStringField(v, "optionId") && typeof v.reason === "string")) {
867
+ return false;
868
+ }
869
+ if (v.replace === void 0) return true;
870
+ return isRecord4(v.replace) && isStringField(v.replace, "fromOptionId");
871
+ }
872
+ var CANVAS_LIFECYCLES = ["draft", "under-review", "passed", "rejected", "shelved"];
873
+ function isCanvasTransitionParams(v) {
874
+ if (!(isRecord4(v) && requireCanvasId(v) && isStringField(v, "nodeId") && typeof v.reason === "string")) {
875
+ return false;
876
+ }
877
+ if (!isStringIn(CANVAS_LIFECYCLES, v.to)) return false;
878
+ if (v.rejection === void 0) return true;
879
+ return isRecord4(v.rejection) && isStringField(v.rejection, "reason") && isOptionalString3(v.rejection.reviveCondition);
880
+ }
881
+ function isCanvasCommentParams(v) {
882
+ return isRecord4(v) && requireCanvasId(v) && isStringField(v, "anchorId") && typeof v.text === "string";
883
+ }
884
+ function isCanvasCommentRespondParams(v) {
885
+ return isRecord4(v) && requireCanvasId(v) && isStringField(v, "commentId") && isStringIn(["adopted", "rebutted"], v.disposition) && typeof v.note === "string";
886
+ }
887
+ function isCanvasReviewRequestParams(v) {
888
+ return isRecord4(v) && requireCanvasId(v) && isOptionalString3(v.scope);
889
+ }
890
+ var REVIEW_DIMENSIONS = ["completeness", "necessity", "support", "authenticity", "conflict", "depth"];
891
+ var REVIEW_SEVERITIES = ["must-fix", "suggestion"];
892
+ var SUPPORT_RATINGS = ["sufficient", "gap", "invalid"];
893
+ function isCanvasReviewEntryInput(v) {
894
+ return isRecord4(v) && isStringField(v, "id") && typeof v.round === "number" && Number.isFinite(v.round) && isStringIn(REVIEW_DIMENSIONS, v.dimension) && isStringIn(REVIEW_SEVERITIES, v.severity) && isStringField(v, "targetId") && typeof v.note === "string" && isReviewSupportShape(v) && isReviewSupportSemantics(v);
895
+ }
896
+ function isReviewSupportShape(v) {
897
+ if (v.supportRating !== void 0 && !isStringIn(SUPPORT_RATINGS, v.supportRating)) return false;
898
+ return v.supportGaps === void 0 || isStringArray2(v.supportGaps);
899
+ }
900
+ function isReviewSupportSemantics(v) {
901
+ if (v.supportGaps === void 0) return v.supportRating !== "gap";
902
+ if (v.supportRating !== "gap") return false;
903
+ return Array.isArray(v.supportGaps) && v.supportGaps.length > 0;
904
+ }
905
+ function isCanvasReviewAppendParams(v) {
906
+ return isRecord4(v) && requireCanvasId(v) && typeof v.round === "number" && Number.isFinite(v.round) && Array.isArray(v.entries) && v.entries.every((entry) => isCanvasReviewEntryInput(entry));
907
+ }
908
+ function isCanvasReviewResolveParams(v) {
909
+ return isRecord4(v) && requireCanvasId(v) && isStringField(v, "entryId") && isStringIn(["accepted", "deferred", "rejected"], v.disposition) && typeof v.note === "string";
910
+ }
911
+ function isCanvasConvergeCheckParams(v) {
912
+ return isRecord4(v) && requireCanvasId(v);
913
+ }
914
+ function isCanvasExportParams(v) {
915
+ if (!(isRecord4(v) && requireCanvasId(v))) return false;
916
+ const target = v.target;
917
+ if (!isRecord4(target)) return false;
918
+ if (target.target === "planning-doc") return true;
919
+ return target.target === "requirement-card" && isStringField(target, "leafId");
920
+ }
921
+ function isCanvasDispatchParams(v) {
922
+ return isRecord4(v) && requireCanvasId(v) && isStringField(v, "nodeId") && isStringField(v, "pointer");
923
+ }
924
+ function isCanvasReadParams(v) {
925
+ return isRecord4(v) && requireCanvasId(v) && isOptionalString3(v.subtree);
926
+ }
927
+ function isCanvasListParams(v) {
928
+ return isRecord4(v);
929
+ }
930
+ function isCanvasEnterParams(v) {
931
+ if (!isRecord4(v)) return false;
932
+ const keys = Object.keys(v);
933
+ return keys.length === 1 && keys[0] === "canvasId" && typeof v.canvasId === "string";
934
+ }
935
+ var MARKER_PARAMS_GUARDS = {
936
+ create: isCanvasCreateParams,
937
+ grow: isCanvasGrowParams,
938
+ patch: isCanvasPatchParams,
939
+ "decide-direction": isCanvasDecideDirectionParams,
940
+ select: isCanvasSelectParams,
941
+ transition: isCanvasTransitionParams,
942
+ comment: isCanvasCommentParams,
943
+ "comment-respond": isCanvasCommentRespondParams,
944
+ "review-request": isCanvasReviewRequestParams,
945
+ "review-append": isCanvasReviewAppendParams,
946
+ "review-resolve": isCanvasReviewResolveParams,
947
+ "converge-check": isCanvasConvergeCheckParams,
948
+ export: isCanvasExportParams,
949
+ dispatch: isCanvasDispatchParams,
950
+ read: isCanvasReadParams,
951
+ list: isCanvasListParams,
952
+ enter: isCanvasEnterParams
953
+ };
954
+ function isCanvasMarkerRequest(v) {
955
+ if (!isRecord4(v)) return false;
956
+ if (!isStringIn(CANVAS_MARKER_ACTIONS, v.action)) return false;
957
+ const action = v.action;
958
+ return MARKER_PARAMS_GUARDS[action](v.params);
959
+ }
960
+ function isArgumentMateriality(v) {
961
+ return isStringIn(["fact", "claim"], v);
962
+ }
963
+ function isArgumentPolarity(v) {
964
+ return isStringIn(ARGUMENT_POLARITIES, v);
965
+ }
966
+
967
+ // src/extensions/canvas/state.ts
968
+ var CANVAS_EVENT_TYPES = [
969
+ "CanvasCreated",
970
+ "GrowthDirectionDecided",
971
+ "NodeCreated",
972
+ "NodeModified",
973
+ "StateTransitioned",
974
+ "OptionSelected",
975
+ "NodeDispatched",
976
+ "CommentAdded",
977
+ "CommentResponded",
978
+ "ReviewRequested",
979
+ "ReviewEntryAppended",
980
+ "ReviewEntryResolved",
981
+ "ConvergenceChecked",
982
+ "CanvasExported",
983
+ "DirtiedPathMarked",
984
+ "ReviewConverged",
985
+ "ReviewMaxRoundsReached",
986
+ "ReviewEscalated"
987
+ ];
988
+ var ACTION_EVENT_MAP = {
989
+ create: "CanvasCreated",
990
+ grow: "NodeCreated",
991
+ patch: "NodeModified",
992
+ "decide-direction": "GrowthDirectionDecided",
993
+ select: "OptionSelected",
994
+ transition: "StateTransitioned",
995
+ comment: "CommentAdded",
996
+ "comment-respond": "CommentResponded",
997
+ "review-request": "ReviewRequested",
998
+ "review-append": "ReviewEntryAppended",
999
+ "review-resolve": "ReviewEntryResolved",
1000
+ "converge-check": "ConvergenceChecked",
1001
+ export: "CanvasExported",
1002
+ dispatch: "NodeDispatched"
1003
+ };
1004
+
1005
+ // src/extensions/canvas/errors.ts
1006
+ var CANVAS_ERROR_CODES = [
1007
+ "canvas_not_found",
1008
+ "node_not_found",
1009
+ "invalid_params",
1010
+ "unknown_action",
1011
+ "actor_not_allowed",
1012
+ "forbidden",
1013
+ "selection_conflict",
1014
+ "cycle_detected",
1015
+ "unverified_fact",
1016
+ "dispatch_blocked",
1017
+ "not_converged",
1018
+ "lifecycle_transition_illegal",
1019
+ "entry_ref_missing",
1020
+ "already_resolved",
1021
+ "review_max_rounds",
1022
+ "edge_not_found"
1023
+ ];
1024
+ var CANVAS_ERROR_RECOVERY = {
1025
+ canvas_not_found: "\u753B\u5E03\u4E0D\u5B58\u5728\u6216\u5DF2\u88AB\u5220\u9664\uFF1A\u5148\u7ECF canvas_list / canvas.list \u6838\u5BF9\u753B\u5E03 id \u540E\u91CD\u8BD5",
1026
+ node_not_found: "\u76EE\u6807\u8282\u70B9 id \u4E0D\u5B58\u5728\uFF1A\u5148 canvas_read \u53D6\u5F53\u524D\u6001\uFF0C\u6838\u5BF9\u8282\u70B9 id \u540E\u91CD\u8BD5",
1027
+ edge_not_found: "\u76EE\u6807\u8FB9 id \u4E0D\u5B58\u5728\uFF1A\u5148 canvas_read \u53D6\u5F53\u524D\u6001\uFF0C\u6838\u5BF9\u8FB9 id \u540E\u91CD\u8BD5",
1028
+ invalid_params: "\u8BF7\u6C42\u53C2\u6570\u5F62\u72B6\u975E\u6CD5\uFF1A\u5BF9\u7167\u8BE5 action \u7684 params \u5951\u7EA6\u4FEE\u6B63\u5B57\u6BB5\u540E\u91CD\u8BD5",
1029
+ unknown_action: "action \u4E0D\u5728\u8BCD\u8868\uFF1A\u5BF9\u7167 CANVAS_ACTIONS \u8BCD\u8868\u4FEE\u6B63 action \u540D",
1030
+ actor_not_allowed: "\u5F53\u524D\u64CD\u4F5C\u65B9\u65E0\u6B64\u52A8\u4F5C\u6743\u9650\uFF1A\u67E5\u6743\u9650\u77E9\u9635\uFF08\u8BE5\u52A8\u4F5C\u4EC5\u9650\u7279\u5B9A\u64CD\u4F5C\u65B9\uFF09\uFF0C\u6539\u7531\u6709\u6743\u65B9\u6267\u884C",
1031
+ forbidden: "\u753B\u5E03\u4E0D\u5C5E\u4E8E\u5F53\u524D\u4F1A\u8BDD\uFF08\u753B\u5E03\u5F52\u5C5E\u521B\u5EFA\u5B83\u7684\u4F1A\u8BDD\uFF0C\u8DE8\u4F1A\u8BDD\u8BBF\u95EE\u88AB\u62D2\u7EDD\uFF09\uFF1A\u8BF7\u8BA9\u7528\u6237\u5207\u6362\u5230\u753B\u5E03\u5F52\u5C5E\u4F1A\u8BDD\u540E\u91CD\u8BD5\uFF0C\u6216\u7ECF canvas_list \u67E5\u770B\u5F53\u524D\u4F1A\u8BDD\u53EF\u7528\u7684\u753B\u5E03",
1032
+ selection_conflict: "\u8BE5\u95EE\u9898\u5DF2\u6709\u9009\u5B9A\u65B9\u6848\uFF1A\u6362\u9009\u8D70 select \u7684 replace \u53C2\u6570\uFF08\u540C\u4E00\u8C03\u7528\u5185\u8FC1\u79FB\u65E7\u9009\u5B9A\uFF09\u5E76\u9644\u5BF9\u6BD4\u7406\u7531",
1033
+ cycle_detected: "\u8BE5\u8FB9\u4F1A\u4F7F\u4E3B\u5E72\u6210\u73AF\uFF1A\u5206\u89E3/\u89E3\u8FB9\u53EA\u80FD\u6307\u5411\u4E0A\u5C42\u8282\u70B9\u7684\u4E0B\u5C42\uFF0C\u53BB\u6389\u56DE\u8FB9\u540E\u91CD\u8BD5",
1034
+ unverified_fact: "\u672A\u6838\u5B9E\u7684 fact \u8BBA\u636E\u4E0D\u5F97\u4F5C\u4E3A\u901A\u8FC7\u4F9D\u636E\uFF1A\u5148\u8865\u6838\u5B9E\u72B6\u6001\uFF08factVerified\uFF09\u518D\u91CD\u8BD5",
1035
+ dispatch_blocked: "\u6267\u884C\u53F6\u5B50\u987B\u5148\u901A\u8FC7\u5BA1\u67E5\uFF08passed\uFF09\u5E76\u586B\u5199\u4E0B\u6E38\u4EA7\u7269\u6307\u9488\uFF0C\u624D\u80FD\u6D3E\u53D1",
1036
+ not_converged: "\u753B\u5E03\u672A\u6536\u655B\uFF1A\u5148\u5904\u7F6E\u5168\u90E8 must-fix / \u6E05\u7A7A\u5F85\u91CD\u5BA1\u8DEF\u5F84 / \u786E\u8BA4\u6839\u5224\u636E\uFF0C\u518D\u6267\u884C\u6536\u655B\u786E\u8BA4\u6216\u5BFC\u51FA",
1037
+ lifecycle_transition_illegal: "\u72B6\u6001\u673A\u4E0D\u5141\u8BB8\u8BE5\u8F6C\u79FB\uFF1A\u5BF9\u7167\u5408\u6CD5\u8F6C\u79FB\u8868\uFF08rejected/shelved \u987B\u5148\u590D\u6D3B\u4E3A draft\uFF09\uFF0C\u6216\u7559\u7406\u7531\u8D70\u590D\u6D3B\u8DEF\u5F84",
1038
+ entry_ref_missing: "\u62A5\u544A\u6761\u76EE\u5F15\u7528\u7684\u56FE\u5143\u7D20 id \u4E0D\u5B58\u5728\uFF1A\u5148 canvas_read \u6838\u5BF9\u76EE\u6807 id \u540E\u91CD\u8BD5",
1039
+ already_resolved: "\u8BE5\u6761\u76EE\u5DF2\u6709\u5904\u7F6E\u8BB0\u5F55\uFF08\u5148\u767B\u8BB0\u5148\u751F\u6548\uFF09\uFF1A\u6539\u5224\u8D70\u4E0B\u4E00\u8F6E\u5BA1\u67E5\u590D\u5BA1\uFF0C\u6216\u5728 GUI \u4EE5\u65B0\u8F6E\u6B21\u5904\u7F6E",
1040
+ review_max_rounds: "\u5BA1\u67E5\u5DF2\u8FBE\u8F6E\u6B21\u4E0A\u9650\uFF1A\u5347\u7EA7\u88C1\u51B3\uFF08\u6269\u5927\u5BA1\u67E5\u8303\u56F4\u6216\u4FEE\u6539\u5224\u636E\uFF09\u540E\u91CD\u65B0\u53D1\u8D77\u5BA1\u67E5"
1041
+ };
1042
+ function canvasError(code, message) {
1043
+ return { code, message, recover: CANVAS_ERROR_RECOVERY[code] };
1044
+ }
1045
+
1046
+ // src/extensions/canvas/matrix.ts
1047
+ var CANVAS_ACTOR_MATRIX = {
1048
+ create: { user: true, agent: true, review: false },
1049
+ grow: { user: false, agent: true, review: false },
1050
+ patch: { user: true, agent: true, review: false },
1051
+ "decide-direction": { user: true, agent: false, review: false },
1052
+ select: { user: true, agent: true, review: false },
1053
+ transition: { user: true, agent: true, review: false },
1054
+ comment: { user: true, agent: false, review: false },
1055
+ "comment-respond": { user: false, agent: true, review: false },
1056
+ "review-request": { user: true, agent: true, review: false },
1057
+ "review-append": { user: false, agent: false, review: true },
1058
+ "review-resolve": { user: true, agent: true, review: false },
1059
+ "converge-check": { user: true, agent: false, review: false },
1060
+ export: { user: true, agent: true, review: false },
1061
+ dispatch: { user: true, agent: false, review: false },
1062
+ read: { user: true, agent: true, review: true },
1063
+ list: { user: true, agent: true, review: true }
1064
+ };
1065
+ function isActionAllowed(action, actor) {
1066
+ return CANVAS_ACTOR_MATRIX[action][actor];
1067
+ }
1068
+ var TOOL_ACTION_MAP = {
1069
+ canvas_enter: ["create"],
1070
+ canvas_edit: ["grow", "patch", "select", "transition", "comment-respond"],
1071
+ canvas_read: ["read"],
1072
+ canvas_review: ["review-request", "review-append", "review-resolve"],
1073
+ canvas_export: ["export"],
1074
+ canvas_list: ["list"]
1075
+ };
1076
+ var CANVAS_TOOL_NAMES = Object.keys(TOOL_ACTION_MAP);
1077
+ var NON_TOOL_ACTIONS = [
1078
+ { action: "decide-direction", entry: "gui-only\uFF08\u7528\u6237\u62CD\u677F\uFF1A\u65B9\u5411\u88C1\u51B3\u662F\u7EC8\u88C1\u51B3\u52A8\u4F5C\uFF0Cagent \u4E0D\u5F97\u81EA\u4E3B\uFF09" },
1079
+ { action: "comment", entry: "gui-only\uFF08\u8BC4\u8BBA = \u7528\u6237\u6CE8\u5165\u8BAE\u9898\uFF1B\u54CD\u5E94\u4E49\u52A1\u65B9\u662F agent\uFF0C\u8D70 comment-respond\uFF09" },
1080
+ { action: "converge-check", entry: "gui-only\uFF08\u786E\u8BA4\u6536\u655B = \u7528\u6237\u70B9\u51FB\uFF0C\u4E09\u95E8\u7981\u6821\u9A8C\u540E\u7F6E\u7EC8\u6001\uFF09" },
1081
+ { action: "dispatch", entry: "gui-only\uFF08\u6D3E\u53D1 = \u7528\u6237\u9010\u53F6\u786E\u8BA4 + \u624B\u586B\u4E0B\u6E38\u6307\u9488\uFF0C\u7528\u6237\u62CD\u677F\uFF09" }
1082
+ ];
1083
+ function toolOfAction(action) {
1084
+ for (const tool of CANVAS_TOOL_NAMES) {
1085
+ const actions = TOOL_ACTION_MAP[tool];
1086
+ if (actions.includes(action)) return tool;
1087
+ }
1088
+ return void 0;
1089
+ }
1090
+ function allToolActions() {
1091
+ const out = [];
1092
+ for (const tool of CANVAS_TOOL_NAMES) {
1093
+ for (const action of TOOL_ACTION_MAP[tool]) {
1094
+ if (!out.includes(action)) out.push(action);
1095
+ }
1096
+ }
1097
+ return out;
1098
+ }
1099
+ function allCanvasActions() {
1100
+ return CANVAS_ACTIONS;
1101
+ }
1102
+
797
1103
  // src/pending-entries.ts
798
1104
  var PENDING_REGISTER_ENTRY_TYPE = "pending:register";
799
1105
  var PENDING_UNREGISTER_ENTRY_TYPE = "pending:unregister";
800
1106
  function scanPendingEntries(entries) {
801
- const scan = { registerEntries: [], unregisteredIds: /* @__PURE__ */ new Set() };
1107
+ const scan = {
1108
+ registerEntries: [],
1109
+ unregisteredIds: /* @__PURE__ */ new Set(),
1110
+ registerTypes: /* @__PURE__ */ new Map(),
1111
+ unregisterStatuses: /* @__PURE__ */ new Map()
1112
+ };
1113
+ const seenRegisterIds = /* @__PURE__ */ new Set();
802
1114
  for (const raw of entries) {
803
1115
  if (!raw || typeof raw !== "object") continue;
804
1116
  const entry = raw;
1117
+ const data = entry.data ?? {};
805
1118
  if (entry.customType === PENDING_REGISTER_ENTRY_TYPE) {
806
- scan.registerEntries.push({ data: entry.data ?? {} });
1119
+ scan.registerEntries.push({ data });
1120
+ if (typeof data.id === "string" && data.id !== "" && !seenRegisterIds.has(data.id)) {
1121
+ seenRegisterIds.add(data.id);
1122
+ if (typeof data.type === "string") scan.registerTypes.set(data.id, data.type);
1123
+ }
807
1124
  } else if (entry.customType === PENDING_UNREGISTER_ENTRY_TYPE) {
808
- const data = entry.data ?? {};
809
- if (typeof data.id === "string") scan.unregisteredIds.add(data.id);
1125
+ if (typeof data.id === "string") {
1126
+ scan.unregisteredIds.add(data.id);
1127
+ const status = data.status;
1128
+ if (data.id !== "" && typeof status === "string" && MAPPED_PENDING_STATUSES.has(status)) {
1129
+ scan.unregisterStatuses.set(data.id, status);
1130
+ }
1131
+ }
810
1132
  }
811
1133
  }
812
1134
  return scan;
813
1135
  }
1136
+ function scanPendingFields(entries) {
1137
+ const { registerTypes, unregisterStatuses } = scanPendingEntries(entries);
1138
+ return { registerTypes, unregisterStatuses };
1139
+ }
814
1140
  function applyPendingDiff(scan) {
815
1141
  const active = [];
816
1142
  const seen = /* @__PURE__ */ new Set();
@@ -853,21 +1179,33 @@ var REASON_STATUS_MAP = {
853
1179
  function mapReasonToStatus(reason) {
854
1180
  return REASON_STATUS_MAP[reason] ?? "completed";
855
1181
  }
1182
+ var MAPPED_PENDING_STATUSES = new Set(Object.values(REASON_STATUS_MAP));
856
1183
  export {
1184
+ ACTION_EVENT_MAP,
857
1185
  ASK_USER_MARKER,
858
1186
  BACKGROUND_TASK_ID_PREFIX,
859
1187
  BACKGROUND_TASK_REGISTRY_FILENAME,
860
1188
  BACKGROUND_TASK_REGISTRY_VERSION,
861
1189
  BASE_TOOL_ENHANCE_DIRNAME,
1190
+ CANVAS_ACTIONS,
1191
+ CANVAS_ACTOR_MATRIX,
1192
+ CANVAS_ERROR_CODES,
1193
+ CANVAS_ERROR_RECOVERY,
1194
+ CANVAS_EVENT_TYPES,
1195
+ CANVAS_MARKER,
1196
+ CANVAS_MARKER_ACTIONS,
1197
+ CANVAS_TOOL_NAMES,
862
1198
  GUI_WIDGET_MARKER,
863
1199
  HISTORY_LIMIT,
864
1200
  INFLIGHT_REPORT_ACK,
865
1201
  JOURNAL_REPORT_ACK,
1202
+ MAPPED_PENDING_STATUSES,
866
1203
  MAX_TERMINAL_REGISTRY_ENTRIES,
867
1204
  MS_PER_DAY,
868
1205
  MS_PER_HOUR,
869
1206
  MS_PER_MINUTE,
870
1207
  MS_PER_SECOND,
1208
+ NON_TOOL_ACTIONS,
871
1209
  PENDING_REGISTER_ENTRY_TYPE,
872
1210
  PENDING_UNREGISTER_ENTRY_TYPE,
873
1211
  PLAN_LIFECYCLE_EVENTS,
@@ -886,11 +1224,15 @@ export {
886
1224
  SUBAGENT_INFLIGHT_MARKER,
887
1225
  SUBAGENT_JOURNAL_MARKER,
888
1226
  TASK_ENTRY_TYPE,
1227
+ TOOL_ACTION_MAP,
889
1228
  UI_FORM_MARKER,
890
1229
  WORKFLOW_RESULT_CUSTOM_TYPE,
1230
+ allCanvasActions,
1231
+ allToolActions,
891
1232
  appendExecutionRecord,
892
1233
  applyPendingDiff,
893
1234
  callMarkerRpc,
1235
+ canvasError,
894
1236
  collectActivePendingIds,
895
1237
  dateToOnceCron,
896
1238
  derivePhase,
@@ -905,9 +1247,30 @@ export {
905
1247
  guiComponent,
906
1248
  guiResult,
907
1249
  guiSetWidget,
1250
+ isActionAllowed,
908
1251
  isActiveBackgroundTaskState,
1252
+ isArgumentMateriality,
1253
+ isArgumentPolarity,
909
1254
  isAskUserQuestion,
910
1255
  isBackgroundTaskRegistryEntry,
1256
+ isCanvasCommentParams,
1257
+ isCanvasCommentRespondParams,
1258
+ isCanvasConvergeCheckParams,
1259
+ isCanvasCreateParams,
1260
+ isCanvasDecideDirectionParams,
1261
+ isCanvasDispatchParams,
1262
+ isCanvasEnterParams,
1263
+ isCanvasExportParams,
1264
+ isCanvasGrowParams,
1265
+ isCanvasListParams,
1266
+ isCanvasMarkerRequest,
1267
+ isCanvasPatchParams,
1268
+ isCanvasReadParams,
1269
+ isCanvasReviewAppendParams,
1270
+ isCanvasReviewRequestParams,
1271
+ isCanvasReviewResolveParams,
1272
+ isCanvasSelectParams,
1273
+ isCanvasTransitionParams,
911
1274
  isChannelErrorResult,
912
1275
  isFormAnswers,
913
1276
  isFormQuestion,
@@ -939,8 +1302,10 @@ export {
939
1302
  readResumeHint,
940
1303
  replayFoldEntries,
941
1304
  scanPendingEntries,
1305
+ scanPendingFields,
942
1306
  setWidgetDual,
943
1307
  snapshotToTask,
1308
+ toolOfAction,
944
1309
  transition,
945
1310
  truncateSelfReview,
946
1311
  uiFormInteract,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhushanwen/extension-protocol",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "description": "Cross-layer pi extension contract package: dual-mode (TUI/GUI) rendering helpers, session/background-task/pending-entries protocols, and shared behavior primitives",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",