@ory/continue 0.10.0 → 0.11.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/README.md CHANGED
@@ -33,7 +33,7 @@ Two independent things, and you can use either on its own:
33
33
  npx -y -p @ory/continue ory-continue install
34
34
  ```
35
35
 
36
- Continue has no native extension-install command, so `install` writes the Ory hooks directly into `<project>/.continue/settings.json` and materializes the Ory skills under `<project>/.continue/skills/`. Continue surfaces each skill as a slash command automatically, so the local-stack commands (`/local-up`, `/local-down`, `/temporal-up`) ship as skills too. Confirm everything landed:
36
+ Continue has no native extension-install command, so `install` writes the Ory hooks directly into `<project>/.continue/settings.json` and materializes the Ory skills under `<project>/.continue/skills/`. Continue surfaces each skill as a slash command automatically, so the local-stack commands ship as skills too and surface as `/ory-local-up`, `/ory-local-down`, and `/ory-temporal-up`. Confirm everything landed:
37
37
 
38
38
  ```bash
39
39
  npx -y -p @ory/continue ory-continue status
@@ -51,7 +51,7 @@ npx -y -p @ory/continue ory-continue uninstall
51
51
 
52
52
  From any project where you'd like Ory authentication, inside Continue:
53
53
 
54
- 1. **Start a local Ory instance.** Ask Continue *"start the local Ory stack"* or run `/local-up`. A banner prints the seeded test user's email and password — note them.
54
+ 1. **Start a local Ory instance.** Ask Continue *"start the local Ory stack"* or run `/ory-local-up`. A banner prints the seeded test user's email and password — note them.
55
55
  2. **Scaffold Ory into your project.** Ask Continue *"add Ory auth to this app"* (the `ory-auth-setup` skill). It installs Ory Elements, wires the SDK, and generates the login / registration / recovery / settings pages, all targeting the local stack.
56
56
  3. **Sign in.** Start your app, visit the login page, and sign in with the seeded credentials. You now have a real Ory session backed by a real Ory stack — locally, offline, zero configuration.
57
57
 
@@ -64,7 +64,7 @@ Continue runs the Ory plugin as a **subprocess hook**, the same way [Claude Code
64
64
  The hooks wire into these phases:
65
65
 
66
66
  - **SessionStart** — run the user and agent auth gates.
67
- - **PreToolUse / PermissionRequest** — check the tool against Ory Permissions; deny blocks the call (exit code 2) in enforce mode.
67
+ - **PreToolUse / PermissionRequest** — check the tool against Ory Permissions. In enforce mode a `PreToolUse` deny blocks the call with exit code 2, while a `PermissionRequest` deny is returned as a structured deny decision in the hook output. In observe mode a permission-request deny is recorded as an audit span and falls through to Continue's native user prompt — it is never pre-approved on the user's behalf.
68
68
  - **SubagentStart / SubagentStop** — resolve a distinct identity for typed sub-agents and record their lifecycle.
69
69
  - **PostToolUse / Stop / SessionEnd** — trace-only audit spans.
70
70
 
@@ -76,8 +76,11 @@ function safeRmEmpty(dir) {
76
76
  */
77
77
  function installContinueOryAssets(root) {
78
78
  fs.mkdirSync(root, { recursive: true });
79
+ // `skills/` is shared with user-authored skills, so never wipe the whole
80
+ // directory — surgically remove only the Ory-owned skill dirs (same list
81
+ // the uninstall path uses) before re-writing them fresh.
79
82
  const skillsDir = path.join(root, "skills");
80
- fs.rmSync(skillsDir, { recursive: true, force: true });
83
+ (0, argus_1.removeSkillDirs)(skillsDir, [...argus_1.ORY_SKILL_NAMES, ...argus_1.ORY_COMMAND_SKILL_NAMES]);
81
84
  const guideSkills = (0, argus_1.renderOrySkills)(HARNESS, RENDER_OPTS);
82
85
  const commandSkills = (0, argus_1.renderOryCommands)(HARNESS, RENDER_OPTS).map(argus_1.commandToSkill);
83
86
  (0, argus_1.writeSkillTree)(skillsDir, [...guideSkills, ...commandSkills]);
package/dist/handlers.js CHANGED
@@ -412,9 +412,14 @@ async function handlePermissionRequest(input, client) {
412
412
  if (decision.kind === "deny") {
413
413
  return permissionRequestDecision("deny", (0, argus_1.formatDenialMessage)({ tool: toolName, subjectId, namespace }));
414
414
  }
415
- return permissionRequestDecision("allow", decision.kind === "observe"
416
- ? "Ory observe mode — denied by policy but allowed through"
417
- : "Ory permission granted");
415
+ if (decision.kind === "observe") {
416
+ // Observe-mode deny: the permission.observe_deny audit span is already
417
+ // recorded by the gate. Omit `decision` so Continue falls through to
418
+ // its native user prompt — observe mode must never escalate a
419
+ // policy-denied tool into an auto-approval.
420
+ return permissionRequestFallback("Ory observe mode — denied by policy, deferring to user");
421
+ }
422
+ return permissionRequestDecision("allow", "Ory permission granted");
418
423
  }
419
424
  catch (err) {
420
425
  const oryErr = err;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ory/continue",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Ory plugin for Continue CLI (cn): scaffolding skills, a local Ory instance, and authentication, authorization, and audit for every tool call",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://ory.com",
@@ -67,7 +67,7 @@
67
67
  "!dist/**/*.tsbuildinfo"
68
68
  ],
69
69
  "dependencies": {
70
- "@ory/argus": "0.10.0"
70
+ "@ory/argus": "0.11.0"
71
71
  },
72
72
  "engines": {
73
73
  "node": ">=22"