@intutic/sync-daemon 2.8.0 → 2.9.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 (95) hide show
  1. package/README.md +7 -3
  2. package/dist/disconnect/harnesses.d.ts.map +1 -1
  3. package/dist/disconnect/harnesses.js +6 -5
  4. package/dist/disconnect/harnesses.js.map +1 -1
  5. package/dist/disconnect/index.d.ts.map +1 -1
  6. package/dist/disconnect/index.js +14 -2
  7. package/dist/disconnect/index.js.map +1 -1
  8. package/dist/harness/aiderConfigMerger.d.ts +5 -2
  9. package/dist/harness/aiderConfigMerger.d.ts.map +1 -1
  10. package/dist/harness/aiderConfigMerger.js +16 -11
  11. package/dist/harness/aiderConfigMerger.js.map +1 -1
  12. package/dist/harness/antigravityCliHooks.d.ts.map +1 -1
  13. package/dist/harness/antigravityCliHooks.js +2 -1
  14. package/dist/harness/antigravityCliHooks.js.map +1 -1
  15. package/dist/harness/antigravityHooks.d.ts.map +1 -1
  16. package/dist/harness/antigravityHooks.js +2 -1
  17. package/dist/harness/antigravityHooks.js.map +1 -1
  18. package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
  19. package/dist/harness/claudeCodeHooks.js +6 -3
  20. package/dist/harness/claudeCodeHooks.js.map +1 -1
  21. package/dist/harness/clineHooks.d.ts.map +1 -1
  22. package/dist/harness/clineHooks.js +2 -1
  23. package/dist/harness/clineHooks.js.map +1 -1
  24. package/dist/harness/codexHooks.d.ts.map +1 -1
  25. package/dist/harness/codexHooks.js +2 -1
  26. package/dist/harness/codexHooks.js.map +1 -1
  27. package/dist/harness/cursorHooks.d.ts.map +1 -1
  28. package/dist/harness/cursorHooks.js +2 -1
  29. package/dist/harness/cursorHooks.js.map +1 -1
  30. package/dist/harness/dshHooks.d.ts +2 -1
  31. package/dist/harness/dshHooks.d.ts.map +1 -1
  32. package/dist/harness/dshHooks.js +4 -2
  33. package/dist/harness/dshHooks.js.map +1 -1
  34. package/dist/harness/githubCopilotHooks.d.ts.map +1 -1
  35. package/dist/harness/githubCopilotHooks.js +2 -1
  36. package/dist/harness/githubCopilotHooks.js.map +1 -1
  37. package/dist/harness/gooseHooks.d.ts +3 -1
  38. package/dist/harness/gooseHooks.d.ts.map +1 -1
  39. package/dist/harness/gooseHooks.js +7 -3
  40. package/dist/harness/gooseHooks.js.map +1 -1
  41. package/dist/harness/grokHooks.d.ts +2 -1
  42. package/dist/harness/grokHooks.d.ts.map +1 -1
  43. package/dist/harness/grokHooks.js +6 -2
  44. package/dist/harness/grokHooks.js.map +1 -1
  45. package/dist/harness/hermesHooks.d.ts +3 -1
  46. package/dist/harness/hermesHooks.d.ts.map +1 -1
  47. package/dist/harness/hermesHooks.js +11 -5
  48. package/dist/harness/hermesHooks.js.map +1 -1
  49. package/dist/harness/museHooks.d.ts.map +1 -1
  50. package/dist/harness/museHooks.js +2 -1
  51. package/dist/harness/museHooks.js.map +1 -1
  52. package/dist/harness/n8nHooks.d.ts.map +1 -1
  53. package/dist/harness/n8nHooks.js +25 -12
  54. package/dist/harness/n8nHooks.js.map +1 -1
  55. package/dist/harness/openCodeHooks.d.ts.map +1 -1
  56. package/dist/harness/openCodeHooks.js +2 -1
  57. package/dist/harness/openCodeHooks.js.map +1 -1
  58. package/dist/harness/openWebuiHooks.d.ts.map +1 -1
  59. package/dist/harness/openWebuiHooks.js +2 -1
  60. package/dist/harness/openWebuiHooks.js.map +1 -1
  61. package/dist/harness/openclawHooks.d.ts.map +1 -1
  62. package/dist/harness/openclawHooks.js +2 -1
  63. package/dist/harness/openclawHooks.js.map +1 -1
  64. package/dist/harness/openhandsHooks.d.ts +2 -1
  65. package/dist/harness/openhandsHooks.d.ts.map +1 -1
  66. package/dist/harness/openhandsHooks.js +6 -3
  67. package/dist/harness/openhandsHooks.js.map +1 -1
  68. package/dist/harness/piHooks.d.ts +2 -1
  69. package/dist/harness/piHooks.d.ts.map +1 -1
  70. package/dist/harness/piHooks.js +6 -2
  71. package/dist/harness/piHooks.js.map +1 -1
  72. package/dist/harness/windsurfHooks.d.ts +3 -1
  73. package/dist/harness/windsurfHooks.d.ts.map +1 -1
  74. package/dist/harness/windsurfHooks.js +7 -2
  75. package/dist/harness/windsurfHooks.js.map +1 -1
  76. package/dist/index.d.ts +3 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +2 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/lib/hookHost.d.ts +17 -0
  81. package/dist/lib/hookHost.d.ts.map +1 -0
  82. package/dist/lib/hookHost.js +20 -0
  83. package/dist/lib/hookHost.js.map +1 -0
  84. package/dist/lib/policySnapshot.d.ts +37 -2
  85. package/dist/lib/policySnapshot.d.ts.map +1 -1
  86. package/dist/lib/policySnapshot.js +54 -10
  87. package/dist/lib/policySnapshot.js.map +1 -1
  88. package/dist/lib/runtimeEnv.d.ts +2 -2
  89. package/dist/lib/runtimeEnv.d.ts.map +1 -1
  90. package/dist/lib/runtimeEnv.js +1 -1
  91. package/dist/skillWriter.d.ts +1 -1
  92. package/dist/skillWriter.d.ts.map +1 -1
  93. package/dist/skillWriter.js +9 -11
  94. package/dist/skillWriter.js.map +1 -1
  95. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"skillWriter.d.ts","sourceRoot":"","sources":["../src/skillWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,QAKlC,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,ykLA2E7B,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,QAA+E,CAAA;AAE7G,sFAAsF;AACtF,eAAO,MAAM,YAAY,ykbAyHxB,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAG3E,CAAA;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBjF"}
1
+ {"version":3,"file":"skillWriter.d.ts","sourceRoot":"","sources":["../src/skillWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,QAKlC,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,ykLA2E7B,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,QAA+E,CAAA;AAE7G,sFAAsF;AACtF,eAAO,MAAM,YAAY,y7aAuHxB,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAG3E,CAAA;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBjF"}
@@ -123,19 +123,17 @@ Hello! I am **Kitkat**, your friendly agentic control plane assistant for the In
123
123
  Use the \`intutic\` CLI commands to manage the daemon, inspect execution traces, or manage governed task loops in your workspace:
124
124
 
125
125
  ### 1. Connection & Session Setup
126
- - **Authenticate:** \`intutic login [--control-plane-url <url>]\` (authenticates with your Intutic control plane).
127
- - **Initialize Workspace:** \`intutic init\` (detects the developer harnesses in the workspace, like Claude Code or Cursor, and records them for sync).
128
- - **Start Connection:** \`intutic connect\` (boots the local interceptor proxy, writes each recorded harness's rules and hooks, keeps them in sync with the control plane, and writes this skill and the rule-author skill into \`.agents/skills/\` when they are missing).
129
- - **Stop Governing:** \`intutic disconnect [--harness <id>] [--dry-run] [--keep-login]\` (undoes \`connect\` on this machine: restores every harness config it changed, removes its hooks, services and the skills it wrote, and logs out). Run it only when the user asks; \`--dry-run\` shows what would change.
130
- - **Offline Spend Sync:** The sync daemon automatically reconciles offline query consumption logs (\`traces-*.jsonl\`) and local budgets back to the control plane on reconnect.
126
+ - **Initialize Workspace:** \`intutic init\` (detects the developer harnesses in the workspace, like Claude Code or Cursor, and records them in \`~/.intutic/config.json\`).
127
+ - **Install Gates:** \`intutic gates install [--harness <id>] [--route] [--dry-run]\` (writes each recorded harness's blocking hooks, and its rules file from the local SOPs in \`.intutic/sops/\`, with no control plane; \`--route\` also points the harnesses at the local proxy, which must then be running).
128
+ - **Start the Proxy:** \`intutic start\` (boots the local interceptor proxy, and refreshes installed gates at start and whenever \`.intutic/sops/\` changes).
129
+ - **Stop Governing:** \`intutic disconnect [--harness <id>] [--dry-run] [--keep-login]\` (restores every harness config Intutic changed and removes its hooks). Run it only when the user asks; \`--dry-run\` shows what would change.
131
130
 
132
131
  ### 2. Traces & Auditing
133
- - **Check Budget:** \`intutic budget\` (displays overall monthly/daily spend limits, local spend caps, and active task loops).
132
+ - **Check Budget:** \`intutic budget\` (displays the local daily spend cap and today's spend; with a control plane, the workspace limits too).
134
133
  - **List Sessions:** \`intutic traces list\`
135
134
  - **Inspect Session Trace:** \`intutic traces inspect <trace_id>\`
136
- - **Push SOP Rules:** \`intutic sops push <name>\` (promotes local SOP rules to central repository).
137
135
 
138
- ### 3. Governed Task Loops
136
+ ### 3. Governed Task Loops (control plane only)
139
137
  - **Start Task Loop:** \`intutic loop start --name <name> [--budget <USD>] [--sops <indices_or_names>] [--auto-judge]\`
140
138
  - **Execute Wrapped Agent:** \`intutic loop exec --name <name> [--budget <USD>] [--sops <indices_or_names>] [--auto-judge] -- <command>\`
141
139
  - **Complete/Kill Loop:** \`intutic loop complete <loopRunId>\` / \`intutic loop kill <loopRunId>\`
@@ -189,7 +187,7 @@ Intutic names every refusal with a code: an SDK raises it (\`ClawdeBlockedError.
189
187
  ### Held: tell the user, then wait
190
188
  A hold rule wants a person to see this call before it runs. Codes: \`HELD\` (with a hold id, \`hold_…\`), a hook gate's \`[Intutic Governance] HELD:\` message, \`LOOP_RUN_PENDING_REVIEW\` (the loop run is paused for review), and the proxy's \`policy_held\` (a Rego or WASM rule held the request; the error names the hold id). \`SERVER_HELD\` is the MCP registry's version: the server changed its tools in a risky way and waits for an owner or admin on the MCP Servers page.
191
189
  - Tell the user what was held and quote the hold id.
192
- - Only an **Owner, Admin or Engineering Manager** can decide it: \`intutic decision approve <holdId>\` or \`intutic decision reject <holdId>\`, or the Slack card. A developer cannot approve their own hold.
190
+ - Only an **Owner, Admin or Engineering Manager** can decide it, on a control plane: \`intutic decision approve <holdId>\` or \`intutic decision reject <holdId>\`, the review queue, or the Slack card. A developer cannot approve their own hold. With no control plane a hold cannot be approved: the call stays refused.
193
191
  - Do not retry while it is pending. After approval, the identical call (same tool, same arguments) passes only if the workspace's review-hold bypass (\`reviewHoldBypassEnabled\`) is on, and only for a short window (10 minutes by default); otherwise approval records the decision and a retry is held again. The \`intutic_hold_status\` MCP tool says which.
194
192
  - A hold with no hold id could not be recorded, so there is nothing to approve: tell the user.
195
193
 
@@ -223,11 +221,11 @@ Continue without it, or tell the user what would have to change and who can chan
223
221
  ## 🛡️ Policy & Hook Verification
224
222
 
225
223
  1. **Pre-Tool Interception Hooks:**
226
- Harness configurations (e.g. \`.claude/settings.json\`, \`.cursor/hooks.json\`) are automatically updated by \`intutic connect\`. They register execution hooks that block unauthorized tools or unsafe commands before execution.
224
+ Harness configurations (e.g. \`.claude/settings.json\`, \`.cursor/hooks.json\`) are written by \`intutic gates install\`. They register execution hooks that block unauthorized tools or unsafe commands before execution.
227
225
  2. **Local Guidelines & Scoping:**
228
226
  Define local, developer-specific rules inside subdirectories of the \`.intutic/sops/\` directory (e.g. \`.intutic/sops/my-rules/rules.md\`). Initialize them using \`@intutic initialize\` and select active local SOPs using \`@intutic start <ticket> --sops=<indices_or_names>\`. These rules are enforced locally in the developer console to protect developer privacy, while global/corporate rules log incidents back to the control plane.
229
227
  3. **Offline Sync & Promotion:**
230
- When offline, prompt telemetry is stored locally in sharded files \`~/.intutic/logs/traces-YYYY-MM-DD.jsonl\` and budgets are enforced against sharded daily files \`~/.intutic/logs/local-spend-YYYY-MM-DD.jsonl\`. The sync daemon uploads them automatically on connect via \`/api/v1/traces/sync-back\` and cleans up the local files. Rules can be promoted workspace-wide via \`intutic sops push <name>\`.
228
+ When offline, prompt telemetry is stored locally in sharded files \`~/.intutic/logs/traces-YYYY-MM-DD.jsonl\` and budgets are enforced against sharded daily files \`~/.intutic/logs/local-spend-YYYY-MM-DD.jsonl\`. With a control plane, the sync daemon uploads them via \`/api/v1/traces/sync-back\` and cleans up the local files, and rules can be promoted workspace-wide.
231
229
  `;
232
230
  /** Every skill connect writes, by workspace-relative path. */
233
231
  export const BUNDLED_SKILLS = [
@@ -1 +1 @@
1
- {"version":3,"file":"skillWriter.js","sourceRoot":"","sources":["../src/skillWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC,IAAI,CAClD,SAAS,EACT,QAAQ,EACR,qBAAqB,EACrB,UAAU,CACX,CAAA;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2EhC,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE,UAAU,CAAC,CAAA;AAE7G,sFAAsF;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyH3B,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAqD;IAC9E,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,iBAAiB,EAAE;IAC5D,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE;CACnD,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,aAAqB;IAC5D,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC1B,SAAQ,CAAC,uCAAuC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QACD,kEAAkE;QAClE,0DAA0D;QAC1D,MAAM,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QACvC,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACjE,MAAM,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"skillWriter.js","sourceRoot":"","sources":["../src/skillWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC,IAAI,CAClD,SAAS,EACT,QAAQ,EACR,qBAAqB,EACrB,UAAU,CACX,CAAA;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2EhC,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE,UAAU,CAAC,CAAA;AAE7G,sFAAsF;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuH3B,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAqD;IAC9E,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,iBAAiB,EAAE;IAC5D,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE;CACnD,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,aAAqB;IAC5D,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC1B,SAAQ,CAAC,uCAAuC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QACD,kEAAkE;QAClE,0DAA0D;QAC1D,MAAM,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QACvC,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACjE,MAAM,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intutic/sync-daemon",
3
- "version": "2.8.0",
3
+ "version": "2.9.0",
4
4
  "description": "Intutic Sync Daemon — bidirectional state sync between control plane and developer workspaces",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -109,10 +109,10 @@
109
109
  "ws": "^8.21.0",
110
110
  "yaml": "^2.9.0",
111
111
  "zod": "^3",
112
- "@intutic/id": "2.8.0",
113
- "@intutic/logger": "2.8.0",
114
- "@intutic/mcp-governance-proxy": "2.8.0",
115
- "@intutic/shared-types": "2.8.0"
112
+ "@intutic/logger": "2.9.0",
113
+ "@intutic/mcp-governance-proxy": "2.9.0",
114
+ "@intutic/shared-types": "2.9.0",
115
+ "@intutic/id": "2.9.0"
116
116
  },
117
117
  "devDependencies": {
118
118
  "@types/node": "^22",