grix-connector 4.9.6 → 4.10.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 (54) hide show
  1. package/dist/adapter/acp/acp-adapter.js +13 -14
  2. package/dist/adapter/acp/mcode-provider-config.js +2 -0
  3. package/dist/adapter/acp/session-activity.js +1 -1
  4. package/dist/adapter/acp/session-scanner.js +3 -3
  5. package/dist/adapter/claude/claude-bridge-server.js +1 -1
  6. package/dist/adapter/claude/claude-tools.js +1 -1
  7. package/dist/adapter/claude/claude-worker-client.js +1 -1
  8. package/dist/adapter/claude/mcp-http-launcher.js +2 -2
  9. package/dist/adapter/claude/result-timeout.js +1 -1
  10. package/dist/adapter/claude/skill-scanner.js +2 -2
  11. package/dist/adapter/opencode/opencode-adapter.js +5 -5
  12. package/dist/adapter/opencode/session-history.js +2 -2
  13. package/dist/adapter/opencode/session-scanner.js +3 -3
  14. package/dist/adapter/pi/omp-mcp-config.js +3 -0
  15. package/dist/adapter/pi/pi-adapter.js +6 -6
  16. package/dist/adapter/pi/pi-provider-config.js +3 -3
  17. package/dist/adapter/pi/session-history.js +2 -2
  18. package/dist/adapter/shared/identity-injector.js +2 -2
  19. package/dist/adapter/shared/native-provider-config.js +7 -5
  20. package/dist/adapter/shared/serialize-on-file.js +1 -0
  21. package/dist/assets/dsh-bridge/grix-dsh-bridge-4.10.0.tgz +0 -0
  22. package/dist/assets/dsh-bridge/manifest.json +6 -6
  23. package/dist/audit/adapters/acp/generic-acp-audit-adapter.js +2 -2
  24. package/dist/audit/adapters/opencode/opencode-audit-adapter.js +1 -1
  25. package/dist/bridge/bridge.js +2 -2
  26. package/dist/bridge/native-provider-sweep.js +1 -1
  27. package/dist/bridge/provider-quota.js +1 -1
  28. package/dist/bridge/session-identity.js +1 -1
  29. package/dist/bridge/session-list.js +3 -3
  30. package/dist/bridge/session-scan-cache.js +1 -1
  31. package/dist/bridge/session-usage.js +1 -1
  32. package/dist/core/access/allowlist-store.js +1 -1
  33. package/dist/core/config/provider-env.js +1 -1
  34. package/dist/core/file-ops/list-files.js +1 -1
  35. package/dist/core/installer/preflight.js +4 -4
  36. package/dist/core/installer/prereq-installer.js +3 -3
  37. package/dist/core/installer/registry.js +1 -1
  38. package/dist/core/persistence/session-binding-store.js +2 -2
  39. package/dist/core/probe/installed-clients.js +1 -1
  40. package/dist/core/provider-quota/providers.js +2 -2
  41. package/dist/core/skill-sync/enable-roots.js +1 -1
  42. package/dist/default-skills/index.js +1 -1
  43. package/dist/log.js +2 -2
  44. package/dist/manager.js +1 -1
  45. package/dist/mcp/stream-http/config.js +1 -1
  46. package/dist/mcp/stream-http/connection-binding.js +1 -1
  47. package/dist/mcp/stream-http/tool-executor.js +1 -1
  48. package/dist/mcp/stream-http/tool-registry.js +1 -1
  49. package/dist/mcp/stream-http/tool-schemas.js +1 -1
  50. package/dist/protocol/acp-client.js +1 -1
  51. package/dist/types/events.js +1 -1
  52. package/openclaw-plugin/audit-recorder-worker.js +110 -5
  53. package/package.json +1 -1
  54. package/dist/assets/dsh-bridge/grix-dsh-bridge-4.9.6.tgz +0 -0
@@ -4853,11 +4853,48 @@ var GenericAcpAuditAdapter = class {
4853
4853
  }
4854
4854
  const toolUses = /* @__PURE__ */ new Map();
4855
4855
  const toolResults = /* @__PURE__ */ new Map();
4856
+ const permissionRequests = /* @__PURE__ */ new Map();
4857
+ const permissionResponses = /* @__PURE__ */ new Map();
4856
4858
  for (const item of collection.events) {
4857
4859
  const callId = stringValue4(item.event.toolCallId);
4858
- if (!callId) continue;
4859
- if (item.event.type === "tool_use") toolUses.set(callId, item);
4860
- if (item.event.type === "tool_result") toolResults.set(callId, item);
4860
+ if (callId) {
4861
+ if (item.event.type === "tool_use") toolUses.set(callId, item);
4862
+ if (item.event.type === "tool_result") toolResults.set(callId, item);
4863
+ }
4864
+ const requestId2 = stringValue4(item.event.requestId);
4865
+ if (requestId2) {
4866
+ if (item.event.type === "permission_request") permissionRequests.set(requestId2, item);
4867
+ if (item.event.type === "permission_response") permissionResponses.set(requestId2, item);
4868
+ }
4869
+ }
4870
+ if (capture.tools) {
4871
+ for (const [requestId2, request] of permissionRequests) {
4872
+ const response = permissionResponses.get(requestId2);
4873
+ const pr = isRecord6(request.event.permissionRequest) ? request.event.permissionRequest : void 0;
4874
+ const toolCallId = stringValue4(pr?.toolCallId) ?? stringValue4(request.event.toolCallId);
4875
+ const parent = [...requests].reverse().find((req) => Date.parse(req.startedAt) <= Date.parse(request.observedAt)) ?? requests[0];
4876
+ const permission = makeSpan3({
4877
+ job,
4878
+ spanId: `acp:${job.sessionId}:permission:${requestId2}`,
4879
+ parentSpanId: parent?.spanId ?? turnSpanId,
4880
+ kind: "permission",
4881
+ name: stringValue4(pr?.toolName) ?? stringValue4(request.event.toolName) ?? "permission_request",
4882
+ sequence: sequence++,
4883
+ status: !response ? "running" : response.event.permissionDecision === "dropped" ? "failed" : "completed",
4884
+ startedAt: request.observedAt,
4885
+ endedAt: response?.observedAt ?? job.endedAt,
4886
+ nativeEventType: "permission_request",
4887
+ nativeIds: { requestId: requestId2, toolCallId },
4888
+ rawAttributes: {
4889
+ permissionRequestEvent: request.event,
4890
+ ...response ? {
4891
+ permissionResponseEvent: response.event,
4892
+ decision: stringValue4(response.event.permissionDecision)
4893
+ } : {}
4894
+ }
4895
+ });
4896
+ spans.push(permission);
4897
+ }
4861
4898
  }
4862
4899
  if (capture.tools) {
4863
4900
  for (const [callId, use] of toolUses) {
@@ -4941,9 +4978,10 @@ var GenericAcpAuditAdapter = class {
4941
4978
  const evidence = normalized;
4942
4979
  const requests = evidence.spans.filter((span2) => span2.kind === "llm_request");
4943
4980
  const tools = evidence.spans.filter((span2) => span2.kind === "tool_call");
4981
+ const permissions = evidence.spans.filter((span2) => span2.kind === "permission");
4944
4982
  const inputComplete = !evidence.capture.inputOutput || job.input !== void 0;
4945
4983
  const outputComplete = !evidence.capture.inputOutput || job.finalOutput !== void 0 || requests.some((request) => request.outputRefs.length > 0);
4946
- const toolCallsComplete = !evidence.capture.tools || tools.every((tool) => tool.status !== "running");
4984
+ const toolCallsComplete = !evidence.capture.tools || tools.every((tool) => tool.status !== "running") && permissions.every((permission) => permission.status !== "running");
4947
4985
  const usageComplete = requests.length > 0 && requests.every((request) => request.usage?.completeness === "complete");
4948
4986
  const gaps = [...evidence.collection.gaps];
4949
4987
  if (evidence.capture.rawProviderBody) {
@@ -7757,6 +7795,72 @@ var OpenCodeAuditAdapter = class {
7757
7795
  }
7758
7796
  spans.push(tool);
7759
7797
  }
7798
+ const permissionAsks = /* @__PURE__ */ new Map();
7799
+ const permissionReplies = /* @__PURE__ */ new Map();
7800
+ const legacyPermissions = [];
7801
+ let maxSequence = -1;
7802
+ for (const item of collection.events) {
7803
+ if (item.sequence > maxSequence) maxSequence = item.sequence;
7804
+ if (item.event.type === "permission.asked" && stringValue9(item.event.id)) {
7805
+ permissionAsks.set(item.event.id, item);
7806
+ } else if (item.event.type === "permission.replied" && stringValue9(item.event.requestID)) {
7807
+ permissionReplies.set(item.event.requestID, item);
7808
+ } else if (item.event.type === "permission.updated" && isRecord12(item.event.permission)) {
7809
+ legacyPermissions.push(item);
7810
+ }
7811
+ }
7812
+ for (const [requestId2, ask] of permissionAsks) {
7813
+ const reply = permissionReplies.get(requestId2);
7814
+ const tool = isRecord12(ask.event.tool) ? ask.event.tool : void 0;
7815
+ const messageId = stringValue9(tool?.messageID);
7816
+ const permission = makeSpan7({
7817
+ job,
7818
+ spanId: `opencode:${job.sessionId}:permission:${requestId2}`,
7819
+ parentSpanId: (messageId ? requestByMessage.get(messageId)?.spanId : void 0) ?? turnSpanId,
7820
+ kind: "permission",
7821
+ name: stringValue9(ask.event.permission) ?? "permission_request",
7822
+ sequence: sequence++,
7823
+ status: reply ? stringValue9(reply.event.reply) === "reject" ? "failed" : "completed" : "running",
7824
+ startedAt: ask.observedAt,
7825
+ endedAt: reply?.observedAt ?? ask.observedAt,
7826
+ nativeEventType: "permission.asked",
7827
+ nativeIds: {
7828
+ requestId: requestId2,
7829
+ messageId,
7830
+ toolCallId: stringValue9(tool?.callID)
7831
+ },
7832
+ rawAttributes: {
7833
+ permissionRequest: ask.event,
7834
+ ...reply ? { permissionReply: reply.event } : {}
7835
+ }
7836
+ });
7837
+ spans.push(permission);
7838
+ }
7839
+ for (const item of legacyPermissions) {
7840
+ const permissionInfo = item.event.permission;
7841
+ const messageId = stringValue9(permissionInfo.messageID);
7842
+ const permissionId = stringValue9(permissionInfo.id) ?? `legacy:${item.sequence}`;
7843
+ const hasFollowingEvent = item.sequence < maxSequence;
7844
+ const permission = makeSpan7({
7845
+ job,
7846
+ spanId: `opencode:${job.sessionId}:permission:${permissionId}`,
7847
+ parentSpanId: (messageId ? requestByMessage.get(messageId)?.spanId : void 0) ?? turnSpanId,
7848
+ kind: "permission",
7849
+ name: stringValue9(permissionInfo.type) ?? stringValue9(permissionInfo.title) ?? "permission_request",
7850
+ sequence: sequence++,
7851
+ status: hasFollowingEvent ? "completed" : "running",
7852
+ startedAt: item.observedAt,
7853
+ endedAt: item.observedAt,
7854
+ nativeEventType: "permission.updated",
7855
+ nativeIds: {
7856
+ requestId: permissionId,
7857
+ messageId,
7858
+ toolCallId: stringValue9(permissionInfo.callID)
7859
+ },
7860
+ rawAttributes: { permission: permissionInfo }
7861
+ });
7862
+ spans.push(permission);
7863
+ }
7760
7864
  }
7761
7865
  return {
7762
7866
  spans,
@@ -7775,9 +7879,10 @@ var OpenCodeAuditAdapter = class {
7775
7879
  (item) => item.kind === "llm_request"
7776
7880
  );
7777
7881
  const tools = evidence.spans.filter((item) => item.kind === "tool_call");
7882
+ const permissions = evidence.spans.filter((item) => item.kind === "permission");
7778
7883
  const inputComplete = !evidence.capture.inputOutput || job.input !== void 0;
7779
7884
  const outputComplete = !evidence.capture.inputOutput || job.finalOutput !== void 0 || requests.some((request) => request.outputRefs.length > 0);
7780
- const toolCallsComplete = !evidence.capture.tools || tools.every((tool) => tool.status !== "running");
7885
+ const toolCallsComplete = !evidence.capture.tools || tools.every((tool) => tool.status !== "running") && permissions.every((permission) => permission.status !== "running");
7781
7886
  const usageComplete = requests.length > 0 && requests.every((request) => request.usage?.completeness === "complete");
7782
7887
  const gaps = [...evidence.collection.gaps];
7783
7888
  if (evidence.capture.rawProviderBody) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grix-connector",
3
- "version": "4.9.6",
3
+ "version": "4.10.0",
4
4
  "description": "Connect local AI coding agents (Claude, Codex, Gemini, Qwen, DeepSeek, Cursor, OpenCode, Pi, OpenHuman, Reasonix) to the Grix scheduling platform. Also serves as an OpenClaw plugin for Grix channel transport.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",